2

我在将长期存在的分支(称为“度量”)重新定位到“主干”分支的最新版本时遇到问题。目标是让我的更改重新定位,然后提交回 SVN。

rebase 现在有 75 个步骤,第 40 步是对在 svn 中重定位的文件应用重要的源代码更改。

具体来说,我对 /java/**/*.java 中的文件进行了大量更改。同时,这些文件被重新定位到:/src/main/java/**/*.java。

git 状态显示:

# 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”吗?

谢谢。

4

1 回答 1

1

这可能不是最佳解决方案,因为它涉及历史修订。您可以使用git filter-branch将“metrics”分支的/java/**/*.java文件移动到/src/main/java/**/*.java中,然后进行变基。首先,备份您的存储库。然后尝试这样的事情:

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/这将重写您的度量分支的历史记录,有效地将路径以to开头的每个文件移动/src/main/java。如果您只需要这些路径中的 java 文件,请相应地修改perl语句。在你的历史中的不同点上胡闹git ls-files -s | perl -pe <substitution>将帮助你确定你需要什么。

一件可以用 Git (tm) 完成的事情,上面的内容非常激烈。同样,它应该解决文件名问题。之前尝试过一些长期分歧的分支合并,这个特殊的问题不会是你的最后一个问题。如果您的工作流程定期生成高度不同的长期分支,您可能会考虑更改它。

于 2012-07-31T15:16:03.653 回答