更聪明的git filter-branch --subdirectory-filter

时间:2013-04-07 15:31:35

标签: git git-filter-branch

我有一个相当长的历史背后的大型项目,我正在尝试将某些文件放入他们自己的存储库,同时保留他们的整个变更历史。
在此之前,我将我需要保留的所有文件移动到他们自己的project/subdirectory中,因此我可以克隆我的存储库,使用git filter-branch --subdirectory-filter但是这会抛弃文件的整个历史记录,因为subdirectory非常新。

我正在寻找的是一种说“保留所有提交这些文件的提交”的方法,所以我会把所有文件放在该子目录中,然后向后提交说“这个提交中的文件是什么?是的将提交和文件保留在该提交中“。

有没有办法相对无痛地做到这一点?

1 个答案:

答案 0 :(得分:1)

也许您需要先修改原始仓库,以使这些文件的历史记录看起来像是在该子目录中。 然后你可以应用filter-beanch。

请参阅“How can I rewrite history so that all files are in a subdirectory?”:

  

重写提交,以便在project/subdirectory不存在的地方,创建它并将所有文件移动到它:

git filter-branch --prune-empty --tree-filter '
if [[ ! -e project/subdirectory ]]; then
    mkdir -p project/subdirectory
    git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files project/subdirectory
fi'
  

现在将记录历史记录,好像所有文件始终位于project/subdirectory