删除/隐藏git分支而不删除提交历史记录

删除/隐藏git分支而不删除提交历史记录,git,git-branch,git-branch-sculpting,Git,Git Branch,Git Branch Sculpting,情况: 我有一个主回购协议,其中有一个主开发分支和许多从中衍生出来的“实验”分支(例如,exp1和exp2)。这些实验分支的目的是作为产生数值结果的实验的占位符。我记录了实验分支的分支名称(和提交ID),这样我就可以返回提交,准确地查看结果背后的代码和历史记录 但是,现在,有这么多的实验分支,以至于很难看到主树。因此,我正在重新考虑在每一组结果(即每一个实验)后面保留代码占位符的策略。显然,我可以在每个分支上保存工作目录,但是保存提交历史也很好 可能的解决方案: 处理这个问题的一种方法是将实验分

情况:

我有一个主回购协议,其中有一个主开发分支和许多从中衍生出来的“实验”分支(例如,
exp1
exp2
)。这些实验分支的目的是作为产生数值结果的实验的占位符。我记录了实验分支的分支名称(和提交ID),这样我就可以返回提交,准确地查看结果背后的代码和历史记录

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

可能的解决方案:

处理这个问题的一种方法是将实验分支移动到它们自己的独立repo中,每个分支都根在dev分支的提交历史中相应节点的子节点上。下面是我的意思的一个例子:

点击查看更大版本的图片(在imgur.com上)

因此,例如,对于分支
exp1
,我想将提交
A->B->C
导出到以提交
A
为根的单独repo。然后,我可以只记录commit
P1
的散列,这样我就知道
exp1
分支从何而来

问题:

我该怎么做

更好的问题:


另一方面,我强烈怀疑有一个更好的策略来完成我想做的事情——也就是说,清理树以便进行目视检查,但保留先前分支的占位符,以便在需要时返回它们。那么,有人能推荐一种策略吗?

这里有一种选择:在删除分支名称之前,使用非分支引用保存分支提示

因为这些是非分支引用,所以它们不会出现在
git branch
输出中,也不会出现在
git log--branchs
gitk--branchs
显示的内容中。但是,它们将显示在所有清单中,并保留存储库对象


要创建或更新非分支引用,请使用。在
refs/
中选择一个您认为不会与将来使用相冲突的名称空间(当前使用的是
refs/heads/
分支,
refs/tags/
标记,
refs/remotes/
远程分支,
refs/notes/
注释,以及
refs/stash
贮藏库)。

我只保留一个单独的名称空间“档案“我将旧分支推送到的远程回购,然后将它们从本地存储库中删除。@Ajedi32听起来是个不错的主意。如何从git日志命令中排除远程repo?例如,我通常运行
git log--oneline--graph--decoration--all
。我如何修改这个git log命令以不显示给定的远程设备?好问题。现在,我自己不这么做,所以我不确定。如果你发现了,一定要让我知道。;-)此外,对于您提出的解决方案,您可能只想研究一个问题:听起来好像您保留了exp分支,以防以后需要找到提交。为什么不标记它们,而不是保留分支呢?我明白了,这是git所谓的管道命令,它允许您基本上任意创建(更新)引用。而
标签
遥控器
注释
,以及
隐藏
实际上只是引用的名称空间,在git中具有标准公认的含义。对吧?啊哈!谢谢那么,这个命令应该足够好吗<代码>git更新参考文件/archive/run/diss-001来源/run/diss-001是。只需展望未来,看看5年后是否有任何命令或实用程序也在尝试使用
refs/archive/
名称空间。:-)(这似乎不太可能,但5年前,谁会知道会使用
refs/notes/
)@manu3d:只需创建指向所需提交的分支。请记住,任何普通的分支名称(在这种“归档”之前或之后)都只是指向某个特定的提交ID,我们称之为“分支的尖端”。由于ref(例如,
refs/archive/foo
也指向某个特定的提交ID,因此您只需执行
git checkout-b restored refs/archive/foo
即可创建指向该提交的新分支
restored
refs/heads/restored
)。它之所以成为分支,是因为它的名称位于
refs/heads/
中。一旦它是当前分支,Git将自动更新它。如果您的所有“归档分支”都列在
refs/archive/
下,请对每个ref-refs/archive使用
Git来显示它们(请注意,
Git for each-ref
有许多参数,包括控制其输出的格式化指令)。如果您选择了其他名称空间,您将需要至少略有不同的名称空间。我不确定这里的答案是否需要进一步阐述;人们也可以阅读评论。:-)