Git:也在历史中移动文件

时间:2011-04-13 22:24:54

标签: git git-branch

是否可以使用Git的工具将文件移动到新文件夹中,同时修改其完整历史记录,就好像文件是从第一次添加文件一样?

我在合并了一些回购之后得出了这个:我将文件从几个回购文件移动到一个“超级”回购中的不同文件夹中,但是合并的历史记录在git rebasegit svn中表现得非常糟糕当然,完全不同的文件工具可能会在旧位置发生碰撞。

3 个答案:

答案 0 :(得分:7)

所以现在这完成了工作:

git filter-branch --tree-filter '(ls -A; mkdir TheSubdir; echo TheSubdir) | xargs mv'

奇怪但很好:.git目录停留在它应该的位置;也许git以某种方式阻止了它的运动?

答案 1 :(得分:5)

为了修改完整的历史记录,您需要重写每次提交。 git filter-branch是执行此操作的最佳方式。特别是,对于您的情况,git filter-branch --tree-filter some-command将检查您的历史记录的每个版本,运行您可以根据需要修改工作树的命令(例如移动相关目录),然后重写提交以包含树的新内容。

答案 2 :(得分:0)

对于包含空格等的文件/目录,accepted answer中的命令将失败。以下版本是安全的:

git filter-branch -f --tree-filter 'mkdir TheSubdir; \
find . -maxdepth 1 -name TheSubdir -prune -o -name . -true -o -print0 | \
xargs -0 mv -t TheSubdir'