【问题标题】:Remove/hide git branches without deleting commit histories删除/隐藏 git 分支而不删除提交历史
【发布时间】:2014-09-29 22:09:12
【问题描述】:

情况:

我有一个主仓库,其中有一个主开发分支和许多从它发芽的“实验”分支(例如,exp1exp2)。这些实验分支的目的是充当生成数值结果的实验​​的占位符。我记录了实验分支的分支名称(和提交 ID),以便我可以返回到提交以准确查看结果背后的代码和历史记录。

但是,现在有太多的实验分支,以至于很难看到主树。因此,我正在重新考虑将占位符保留在每组结果(即每个实验)背后的代码的策略。显然我可以只保存每个分支的工作目录,但最好保留提交历史。

可能的解决方案:

解决此问题的一种方法是将实验分支移动到它们自己的独立存储库中,每个存储库都植根于 dev 分支的提交历史记录中相应节点的子节点。这是我的意思的说明:

点击here查看大图(在imgur.com上)。

因此,例如,对于分支 exp1,我想将提交 A->B->C 导出到以提交 A 为根的单独存储库。然后,我可以只记录提交P1 的哈希值,这样我就知道exp1 分支是从哪里下来的。

问题:

我该怎么做?

更好的问题:

另一方面,我强烈怀疑有一个更好的策略来做我想做的事情——即整理树以进行目视检查,但将占位符保留在先前的分支上,以便我可以在需要时返回它们。那么,任何人都可以为此推荐一个策略吗?

【问题讨论】:

  • 我只保留一个单独的“归档”远程存储库,将旧分支推送到该存储库,然后从本地存储库中删除它们。
  • @Ajedi32 这听起来是个好主意。我怎么能从我的 git log 命令中排除那个远程仓库?例如,我通常运行git log --oneline --graph --decorate --all。如何修改这个 git-log 命令以 not 显示给定的遥控器?
  • 好问题。现在,我自己不这样做,所以我不确定。如果你发现了,一定要告诉我。 ;-)
  • 另外,对于您提出的解决方案,您可能需要查看git replace
  • 只是一个问题:听起来好像你保留了 exp 分支,以防你以后需要找到提交。为什么不直接标记它们,而不是保留分支?

标签: git git-branch git-branch-sculpting


【解决方案1】:

这是另一种选择:在删除分支名称之前使用非分支引用来保存分支提示。

由于这些是非分支引用,它们不会出现在git branch 输出中,也不会出现在git log --branchesgitk --branches 显示的内容中。但是,它们会出现在 --all 列表中,并且会保留存储库对象。

要创建或更新非分支引用,请使用git update-ref。在refs/ 中选择一个您认为不会与未来使用发生冲突的命名空间(当前使用refs/heads/ 用于分支,refs/tags/ 用于标签,refs/remotes/ 用于远程分支,refs/notes/ 用于注释,@ 987654332@ 用于存储)。

【讨论】:

  • 我明白了,所以这是一个git所谓的plumbing命令,它基本上可以让你随意创建(更新)引用。 headstagsremotesnotesstash 实际上只是在 git 中具有标准公认含义的引用的命名空间。对吗?
  • 啊哈!谢谢。那么,这个命令应该够用了吧? git update-ref refs/archive/run/diss-001 origin/run/diss-001
  • 是的。只需展望未来,看看您想在 5 年后使用的任何命令或实用程序是否也在尝试使用 refs/archive/ 命名空间。 :-)(似乎不太可能,但在 5 年前,谁会知道 refs/notes/ 会被使用?)
  • @manu3d:只需创建指向所需提交的分支。请记住,任何普通的分支名称(在这种“归档”之前或之后)都只是指向某个特定的提交 ID,然后我们称之为“分支的尖端”。由于像 refs/archive/foo also 这样的引用指向某个特定的提交 ID,您可以简单地执行 git checkout -b restored refs/archive/foo 来创建指向该提交的新分支 restored (refs/heads/restored)。使它成为一个分支的原因是它的名字在refs/heads/。一旦它是 current 分支,Git 就会自动更新它。
  • 如果您的所有“归档分支”都列在refs/archive/ 下,请使用git for-each-ref refs/archive 显示它们(注意git for-each-ref 有许多参数,包括用于控制其输出的格式化指令)。如果您选择了一些其他名称空间,您将需要一些至少略有不同的东西。我不确定这里的答案需要额外的阐述;人们也可以阅读 cmets。 :-)
猜你喜欢
  • 1970-01-01
  • 2015-09-02
  • 2019-11-14
  • 2013-01-23
  • 2021-03-29
  • 2014-11-25
  • 2022-10-15
  • 2011-10-26
  • 1970-01-01
相关资源
最近更新 更多