我有一个问题是将我的长期分支(称为“指标”)重新定位到我的“主干”分支的最新版本上。我的目标是让我的更改得到重新定位,然后再回到SVN。
rebase现在有75个步骤,步骤40正在对svn中重新定位的文件应用重要的源代码更改。
具体来说,我对/java/**/*.java中的文件进行了大量更改。同时,这些文件被重定位到:/ src / main / java / ** / * .java。
git status显示:
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
#
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# added by them: java/StripesResources.properties
.... (many files like this)
# both deleted: src/StripesResources.properties
.... (many files like this)
# added by us: src/main/java/StripesResources.properties
.... (many files like this)
此状态下有900多个文件,如何合并它们?并非所有这些都有重大变化。
我尝试将文件的'他们'版本(我的更改)移动/复制到'我们'的位置(他们应该在哪里),但这似乎不起作用。
在这种情况下我应该使用'git mv'吗?
感谢。
答案 0 :(得分:1)
这可能不是最佳解决方案,因为它涉及历史修订。您可以使用git filter-branch
将“指标”分支的/java/**/*.java
文件移至/src/main/java/**/*.java
,然后执行rebase。首先,备份您的存储库。然后尝试这样的事情:
git checkout metrics
git filter-branch --index-filter '
git ls-files -s |
perl -pe "s{\t/java/\"?}{\t/src/main/java/}" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info &&
mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE
' HEAD
这将重写您的指标分支的历史记录,有效地将路径以/java/
开头的每个文件移动到/src/main/java
。如果您只想要这些路径中的java文件,请相应地修改perl
语句。在历史记录的不同位置使用git ls-files -s | perl -pe <substitution>
进行操作将帮助您确定所需内容。
可以用Git(tm)完成的事情,上面是非常激烈的。同样,它应该解决文件名问题。在尝试过几个长期分歧的分支合并之前,这个特殊问题不会是你的最后一个。如果您的工作流程定期生成高度不同的长期分支,您可以考虑更改它。