Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git筛选器分支保留了太多的历史记录_Git_Git Filter Branch - Fatal编程技术网

git筛选器分支保留了太多的历史记录

git筛选器分支保留了太多的历史记录,git,git-filter-branch,Git,Git Filter Branch,我正在研究将一个相当大的单一回购拆分为多个回购,每个应用程序。monorepo的文件夹结构如下: |- a | |- application1 | |- application2 |- b | |- application3 | |- application4 |- c | |- application5 如果要迁移application1,请运行以下命令: git filter-branch --tag-name-filter cat --subdirectory-filter "

我正在研究将一个相当大的单一回购拆分为多个回购,每个应用程序。monorepo的文件夹结构如下:

|- a
|  |- application1
|  |- application2
|- b
|  |- application3
|  |- application4
|- c
|  |- application5
如果要迁移application1,请运行以下命令:

git filter-branch --tag-name-filter cat --subdirectory-filter "a/application1" -- --all
git reset --hard
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now
这已经适用于多个应用程序,但现在我遇到了一个问题:其中一个迁移的应用程序具有巨大的git历史,接近monorepo本身的大小。当检查历史时,我发现它保留了mono回购的大部分历史,包括属于其他应用程序的提交

浏览历史记录时,最新的提交看起来不错,它们都与迁移的应用程序相关。转折点似乎是提交,其中所讨论的应用程序从一个文件夹移动到另一个文件夹(因此,让我们假设application1在某一点上从文件夹b移动到文件夹a)。在此之前的历史记录似乎包含了整个monorepo的所有历史记录


有人知道如何解决这个问题吗?

似乎application1首先是从
b
a
,然后还原,然后再次移动到
a
。不确定这是否是git混淆的原因。您的子目录筛选器告诉git:对于每个提交,删除除a/application1文件以外的所有文件。在
b/application1
中包含文件的任何提交在这里都是无趣的。使用
--子目录过滤器来保存
b/application1
文件,没有真正好的方法;您需要一个更复杂的筛选器。请记住,除了每个提交都记录其父级之外,所有提交都是独立的快照。删除(从复制过程中)所有的
b/..
文件后,您仍将保留更改名称前的
a/..
文件以及更改名称后的
a/..
文件的(副本)。此外,在我迁移的git历史记录中,
git mv
似乎是创建文件,而不是移动,因此当我查看文件历史记录时,移动之前的历史记录不可用。有点道理,因为旧文件夹在我的新回购协议中没有意义。一个解决方案可能是在移动之前删除所有git历史记录,但同样,保留以前的更改也很好。@t如果我创建一个同时覆盖A/application1和b/application1(仅存在于git历史记录中)的筛选器,这能起作用吗?