首先,克隆您的存储库,以便您可以单独处理它,并且您的原始存储库保持完整,以防这里出现任何问题。
git clone --no-hardlinks c:\workspace\test\src c:\sandbox
编写一个脚本,在任何一次提交时进行适当的更改。我不熟悉 Windows 脚本,但您会希望您的脚本创建一个名为src
( ie, c:\sandbox\src
) 的新子目录,然后将除该.git
目录和任何.git*
文件 ( eg, .gitignore
) 之外的所有内容移动到该新子目录中。确保您的脚本在 repo 中的任何提交上都能正常工作,而不仅仅是在当前状态下。然后运行:
git filter-branch --tree-filter c:\absolute\path\to\your\script
这将导致 git 检查 repo 中的每个提交,运行您的脚本,然后将提交替换为最终结果。接下来,如果您有任何被忽略或未提交的文件,您需要将它们复制到新存储库中的适当位置。检查以确保 filter-branch 具有预期的效果,并且新的 repo 看起来像你想要的那样。确定自己满意后,删除c:\workspace\test
然后c:\sandbox
移至c:\workspace\test
.
我更喜欢使用--tree-filter
,如此处所示,而不是--index-filter
. 它的效率较低(因为它必须检查每个提交而不是直接编辑索引),但我发现它更直观。如果需要,它还允许您更改 repo 中文件的内容(也许更新绝对路径)。