当项目包含其他子模块时,git filter-branch 不工作

标签 git git-filter-branch

假设我有以下项目结构:

.git

--APP
-----F

--LIBS
------A
-------.git
------B
-------.git
------C
-------.git
------D
-------.git

F是APP文件夹下的子文件夹。 A、B、CD 是位于 LIBS 文件夹下的四个子模块。

我想做的是将F 文件夹解压到不同的存储库(目前它只是一个简单的子文件夹)。

到目前为止,我已经完成了以下工作:

for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote; done

在那之后,我跑了:

git filter-branch --prune-empty --tag-name-filter cat --subdirectory-filter APP/F/ -- --all

结果是:

.git

--F

--LIBS
------A
-------.git
------B
-------.git
------C
-------.git
------D
-------.git

似乎层次结构中的子模块仍然重写了历史。

但是,我想要的结果是只保留 F 目录,没有其他子模块..:

--F
---.git

最佳答案

filter-branch 不是处理子模块的正确工具。您想要的是删除相应的子模块(使用 rm),然后然后使用 filter-branch 移​​动层次结构根,如下所示:

rm -r LIBS && git add --all && git commit -m "Dropped submodules"
git filter-branch --prune-empty --tag-name-filter cat --subdirectory-filter APP/F/

关于当项目包含其他子模块时,git filter-branch 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51631677/

相关文章:

windows - windows下git mingw32和长路径/文件名

git - 如何告诉 git 忽略全局配置

git - 如何从 git 存储库中删除旧的历史记录?

git - 如何压缩分支中的提交

git - 如何从 'git filter-branch' 获取旧的->新的重写提交 SHA 列表?

git - 在一系列提交上运行 filter-branch

git - 使用重写的 Git 存储库历史更新开发团队,删除大文件

git - 在提交之前运行脚本并将更新包含在此提交中?

java - 将代码推送到 bitbucket 时构建 jenkins 作业

git - 进行选择性 rebase