在整个Git提交历史记录中重命名目录

时间:2013-10-07 16:58:45

标签: git git-rebase

我正在尝试重命名一个在六次提交之前和所有后续提交中引入的目录。这些提交尚未推出。

我尝试了什么?

  • 我尝试将git filter-branchmv old new命令一起使用,但在HEAD~6之前的提交失败,因为该目录不存在。
  • 我已尝试git rebase -i HEAD~6,编辑每次提交,但我无法使用mv old new因为git锁定了文件,也无法在Windows资源管理器中重命名。
  • 我使用cp -R old new; rm -rf old; git add new尝试了相同的变基,但这会在HEAD~4及更高版本上产生合并冲突。

值得注意的是,引入此目录的提交是此分支中的第一个提交(分支是master之前的六个提交)并且我没有触及master因为我扩展了。

我还阅读了this question

最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

git filter-branch应该可以正常工作;只需通过附加mv使|| true命令正常失败。例如,要将baz/重命名为foo/bar/baz/

git filter-branch --force --tree-filter \
    'mkdir -p foo/bar; mv baz foo/bar/ || true' \
    --tag-name-filter cat -- --all

答案 1 :(得分:2)

https://git-scm.com/docs/git-filter-branch州:

将整个树移动到子目录中,或从中删除它:

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

答案 2 :(得分:0)

为什么不简单地启动一个新的分支(在主服务器上),然后在~N之间进行旧分支和新分支之间的简单交换,并连续选择6个提交。

例如git cherry-pick& git mv old new& git commit

它可能不是'快'但它足够快,只有6次提交修复。