sve*_*ner 6 git git-filter-branch git-rewrite-history
我想将多个Git存储库(比如repoA和repoB)合并到一个新的存储库中.新存储库(repoNew)应该在单独的子目录中包含每个repoA和repoB.由于我到目前为止只在本地工作,我可以做我想要的任何存储库.
在这种情况下,似乎标准的方法是使用git filter-branch重写每个repoA和repoB的历史,使它看起来好像它们一直在子文件夹中,然后将它们合并到repoNew中.
第一步是困扰我的事情.我很清楚如何回答历史记录,以便所有文件(除了我已经移动过的文件)都在子目录中?(Dan Molding的答案),这正是我想要的.
他提出了类似的建议:
git filter-branch --prune-empty --tree-filter '
if [[ ! -e repoA ]]; then
mkdir -p repoA
git ls-tree --name-only $GIT_COMMIT | xargs -i mv {} repoA
fi'
Run Code Online (Sandbox Code Playgroud)
结果应该是下面的文件夹结构<repoA-GIT-base>现在应该在<repoA-GIT-base>/repoA.然而,这种情况并非如此.以上命令在不同的提交中随机失败,并显示"mv:无法将'src'移动到'repoA/src'之类的消息
如上所述重写历史记录时如何避免错误的提交?
编辑:
您应该考虑.gitignore从移动中排除这样:
git filter-branch --prune-empty --tree-filter '
if [[ ! -e repoA ]]; then
mkdir -p repoA;
git ls-tree --name-only $GIT_COMMIT |
grep -ve '^.gitignore$' |
xargs -i mv {} repoA;
fi'
Run Code Online (Sandbox Code Playgroud)
该命令似乎仍然随机失败.我试了好几次,每次在不同的提交中都发生了"无法移动"的失败.我观察到,当我排除.gitignore通过所有提交的可能性时,似乎增加了.我能够连续在我的三个不同的存储库上执行移动而不会失败.当我再次尝试它时,只是为了获得其中一个存储库的另一个丢弃副本的乐趣,它再次失败了.
由于涉嫌使用某些文件的过程,我有时也很难删除我的丢弃副本,这个问题可能与Windows 7文件访问处理有关,但我无法在那里做出严肃的假设.
继续尝试直到成功当然是荒谬的,并且可能无法在具有大量提交的存储库上工作(我的只有~30).
信息:我在Windows 7 64位企业版上使用git-bash与git版本1.7.10.msysgit.1.
我编写了一个基于 libgit2 的程序来过滤 git 分支以用于另一个目的,我对此稍作修改以实现您想要的功能。你可以尝试一下。
它位于 github 上 git_filter 的 subdir 分支中:
https://github.com/slobababy/git_filter/tree/subdir
我刚刚在我们的 100000 提交存储库上测试了它,花了 43 秒。
我编写该程序是因为基于 git 过滤器分支的解决方案需要几天到几周的时间才能完成。
示例配置过滤“测试”存储库并将所有内容放入“测试”子目录中 - 您可以更改它以执行您想要的操作。
| 归档时间: |
|
| 查看次数: |
1652 次 |
| 最近记录: |