如何使用移动的文件解析git-svn rebase?

时间:2012-04-04 16:13:53

标签: git svn merge git-svn rebase

我有一个问题是将我的长期分支(称为“指标”)重新定位到我的“主干”分支的最新版本上。我的目标是让我的更改得到重新定位,然后再回到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'吗?

感谢。

1 个答案:

答案 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)完成的事情,上面是非常激烈的。同样,它应该解决文件名问题。在尝试过几个长期分歧的分支合并之前,这个特殊问题不会是你的最后一个。如果您的工作流程定期生成高度不同的长期分支,您可以考虑更改它。