是否可以使用Git的工具将文件移动到新文件夹中,同时修改其完整历史记录,就好像文件是从第一次添加文件一样?
我在合并了一些回购之后得出了这个:我将文件从几个回购文件移动到一个“超级”回购中的不同文件夹中,但是合并的历史记录在git rebase
和git svn
中表现得非常糟糕当然,完全不同的文件工具可能会在旧位置发生碰撞。
答案 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'