gpt4 book ai didi

git - 如何重写 Git 历史,使所有文件都在一个子目录中?

转载 作者:太空狗 更新时间:2023-10-29 13:14:38 26 4
gpt4 key购买 nike

我想将多个 Git 存储库(比如说 repoA 和 repoB) merge 到一个新的存储库中。新存储库 (repoNew) 应在单独的子目录中包含每个 repoA 和 repoB。由于到目前为止我只在本地工作,所以我可以对存储库做任何我想做的事情。

在这种情况下,标准方法似乎是使用 git filter-branch重写每个 repoA 和 repoB 的历史,使它们看起来好像一直在一个子文件夹中,然后将它们 merge 到 repoNew 中。

第一步是困扰我的地方。我很清楚 SO 答案,例如 How can I rewrite history so that all files, except the ones I already moved, are in a subdirectory? (Dan Moulding 的回答),这正是我想要的。

他的建议大致如下:

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'

结果应该是<repoA-GIT-base>下的文件夹结构现在应该在 <repoA-GIT-base>/repoA .然而,这种情况并非如此。上面的命令在不同的提交中随机失败,并显示一条消息,如“mv: cannot move 'src' into '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'

该命令似乎仍然随机失败。我尝试了几次,每次都在不同的提交中出现“无法移动”的失败。我观察到当我排除 .gitignore 时通过所有提交的机会似乎增加了。我能够在所有三个不同的存储库上连续执行移动而不会失败。当我只是为了好玩而在其中一个存储库的另一个一次性副本上再次尝试时,它再次失败。

因为我有时也很难删除我的一次性副本,因为据称一个进程使用了​​一些文件,这个问题可能与 Windows 7 文件访问处理有关,但我无法做出认真的假设那里。

继续尝试直到成功当然是荒谬的,并且可能无法在具有大量提交的存储库上工作(我的只有约 30 个)。

信息:我在 Windows 7 64 位企业版上使用 git-bash 和 git 版本 1.7.10.msysgit.1。

最佳答案

我怀疑您正在寻找类似 git subhistory 的内容.这是一个非常小的项目,似乎没有得到很好的维护,但它的设计也几乎完全符合您的描述。试试吧!

关于git - 如何重写 Git 历史,使所有文件都在一个子目录中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22170127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com