2

我有一个相当大的项目,其背后有着悠久的历史,我试图将某些文件放入他们自己的存储库中,同时保留他们的整个更改历史。
在此之前,我移动了所有需要保留的文件project/subdirectory,因此我可以克隆我的存储库,使用,git filter-branch --subdirectory-filter但这会丢弃文件的整个历史,因为它subdirectory是非常新的。

我正在寻找的是一种说“保留导致这些文件的所有提交”的方式,所以我会获取该子目录中的所有文件并将提交向后走,说“那个文件在这个提交中吗?是的,保留提交以及该提交中的文件”。

有没有办法相对轻松地做到这一点?

4

1 回答 1

1

也许您需要先修改原始存储库,以便这些文件的历史看起来像它们总是在那个子目录中。
然后你可以应用过滤器。

请参阅“如何重写历史记录以使所有文件都在子目录中? ”:

重写提交,以便任何地方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.

于 2013-04-07T15:48:02.133 回答