2011-04-13 71 views
7

Git的工具有可能在修改文件的完整历史记录时将文件移动到新文件夹中,就像文件从第一次添加到那里一样?Git:移动历史中的文件也

我想出了这个并购一些回购在一起后,我搬到里面一个“超级”回购从几回购到不同的文件夹中的文件,但合并后的历史表现非常不好用git rebasegit svn工具完全不同的文件可能发生冲突在他们的旧地点当然。

回答

6

所以现在这个完成了任务:

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

奇怪,但不错:.git的目录会留在它应该;或许git会以某种方式阻止它的移动?

+1

'filter'shell命令运行在git的subdir .git-rewrite中,除了当前的修订版本文件外,凉。 – dronus 2011-04-15 00:26:54

5

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

+0

好凉。所以基本上,'git filter-branch'检查每一个修订版,并再次检查它,替换旧的版本?听起来很疯狂,我想我会重写存储过程。无论如何,我试试! – dronus 2011-04-14 20:16:49

+0

@dronus是的,这就是它的功能。 – 2011-04-14 20:20:48

+0

@dronus其实,对于你的情况,你只需要移动东西,你应该可以做一个'git filter-branch --index-filter',就像'--tree-filter'一样,但是不会实际上并没有检查这些文件,它需要你直接操纵索引中的所有内容。运行速度比'--tree-filter'运行速度快,但由于您需要直接修改索引而不是仅仅移动文件,因此编写起来会有点困难。在'filter-branch'文档结尾处有一个例子,演示了如何做到这一点。 – 2011-04-14 20:29:23

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'