我正在尝试重命名一个在六次提交之前和所有后续提交中引入的目录。这些提交尚未推出。
我尝试了什么?
git filter-branch
与mv 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。
最好的方法是什么?
答案 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次提交修复。