【问题标题】:git filter-branch - remove one of many submodulesgit filter-branch - 删除许多子模块之一
【发布时间】:2018-10-10 10:55:46
【问题描述】:

我一直在使用 git filter-branch 来删除遗留文件,但是对于一个裸露的 git repo,我无法弄清楚如何重写我的 git 历史记录,其中我的一个 git 子模块被删除。

我有一个顶级仓库“Donald”,在“Donald”下面有四个子模块“Huey”、“Dewey”、“Louie”和“Phooey”[1]。 永远不应该添加“Phooey” - 不幸的是,时间已经过去了。

我找到的最佳参考是git filter-branch remove all submodules from my repo,但它有点太多了。

[1] http://www.sullivanet.com/duckburg/phooey.htm :-)

【问题讨论】:

  • 您是否在其他人正在使用的分支上进行过滤分支?在这种情况下,这可能有点有害,因为由于您正在重写历史记录,因此您将重写您的队友已经签出并正在处理的提交。一般来说,在大多数情况下,使用 filter-branch 删除几个文件似乎有点过分了。如果我正确理解您的情况,对您的同事来说,最不打扰、最不复杂和最不必要的额外工作就是删除文件夹并提交删除。它在历史上也更加透明,人们会看到发生了什么。
  • @dvaergiller 我完全理解,但我有充分的商业理由朝这个方向发展

标签: git git-filter-branch git-bare


【解决方案1】:

首先,备份。只删除一个模块:

git filter-branch -f --prune-empty --tree-filter '
    git submodule deinit -f -- path/to/module &&
    git rm -rf path/to/module || :
' HEAD &&
rm -rf .git/modules/path/to/module 

【讨论】:

  • 它适用于普通回购,但不适用于裸回购
  • 一个裸仓库不能有子模块,没有什么可删除的。
  • 为什么 git .gitmodules 文件在树过滤器的第一次迭代后的任何后续提交中都保持不变?
  • 为什么会这样?没有任何命令触及.gitmodules
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2012-08-16
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多