我如何存档git分支?

我有一些旧的分支在我的git仓库中,不再处于积极的发展状态。 我想归档分支,以便在运行git branch -l -r时不会默认显示。 我不想删除它们,因为我想保留历史。 我怎样才能做到这一点?

我知道可以在refs / heads之外创build一个ref。 例如,refs / archive / old_branch。 这样做会有什么后果?

我相信正确的做法是标记分支。 如果您在标记分支之后删除分支,那么您已经有效地保留了分支,但不会混乱分支列表。

如果您需要返回分支,请检查标签。 它将有效地从标签恢复分支。

要存档和删除分支:

 git tag archive/<branchname> <branchname> git branch -d <branchname> 

稍后恢复分支:

 git checkout -b <branchname> archive/<branchname> 

分支机构的历史将与您标记历史一样。

杰里米的回答原则上是正确的,但恕我直言,他指定的命令是不完全正确的。

以下是如何将分支存档到标签而无需检出分支(因此,在删除分支之前不必检出到另一分支):

 > git tag archive/<branchname> <branchname> > git branch -D <branchname> 

以下是如何恢复分支:

 > git checkout -b <branchname> archive/<branchname> 

您可以将分支归档到另一个存储库中。 不是很高雅,但我认为这是一个可行的select。

 git push git://yourthing.com/myproject-archive-branches.git yourbranch git branch -d yourbranch 

这是一个别名:

 arc = "! f() { git tag archive/$1 $1 && git branch -D $1;}; f" 

像这样添加它:

 git config --global alias.arc '! f() { git tag archive/$1 $1 && git branch -D $1;}; f' 

请记住已经有git archive命令,因此您不能使用archive作为别名。

你也可以定义别名来查看“存档”分支的列表:

 arcl = "! f() { git tag | grep '^archive/';}; f" 

关于添加别名

是的,你可以使用git update-ref创build一个带有一些非标准前缀git update-ref (例如git update-ref refs/archive/old-topic topic 。到目前为止,我没有看到任何问题。 不像正常的分支或标签,这些将不会显示在通常的git branchgit loggit tag (虽然你可以看到他们与git log --all )。

在短期内复制SHA1就足够了,但是在没有任何ref的情况下, 在3个月(或者几个星期没有reflog)的情况下进行GC_d 。 提交参考是安全的。

我正在使用以下别名:

 [alias] archive-ref = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')" list-archive-ref = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/ rem = !git archive-ref lsrem = !git list-archive-ref 

此外,您可能需要configuration像push = +refs/archive/*:refs/archive/*这样的远程自动推送(或git push origin refs/archive/*:refs/archive/*一次性)。

编辑:通过@ap : git-atticfind了相同想法的perl实现

编辑^ 2:find一个博客文章 ,Gitster自己使用相同的技术。

我正在使用以下别名隐藏归档分支:

 [alias] br = branch --no-merge master # show only branches not merged into master bra = branch # show all branches 

因此,要积极开发分支机构,并展示所有分支机构,包括“存档”分支机构。

延伸史蒂夫的答案,以反映在遥控器上的变化,我做到了

  git tag archive/<branchname> <branchname> git branch -D <branchname> git branch -d -r origin/<branchname> git push --tags git push origin :<branchname> 

从远程恢复,看到这个问题 。

我不会归档分支。 换句话说,分行存档自己。 你想要的是确保有关考古学家的信息可以通过可靠的手段find。 可靠的是,他们帮助日常发展,并没有增加工作完成的额外步骤。 也就是说,我不认为人们会在分支完成后添加标签。

这两个简单的步骤将大大帮助考古学发展。

  1. 使用简单的命名约定将每个任务分支与问题跟踪器中的相关问题链接起来 。
  2. 总是使用git merge --no-ff合并任务分支; 你想要合并提交和历史气泡,即使只是一个提交。

而已。 为什么? 因为作为一个代码考古学家,我很less首先想知道在一个分支上做了什么工作。 更经常的是,为什么在所有尖叫的九个地狱是这样写的代码?! 我需要改变代码,但它有一些奇怪的特点,我需要解决它们,以避免破坏重要的东西。

下一步是git blamefind相关的提交,然后希望日志消息是解释性的。 如果我需要深入挖掘,我会发现这项工作是否在分支机构完成,并阅读整个分支机构(以及问题跟踪器中的评论)。

让我们说在提交XYZ git blame指向。 我打开一个Git历史浏览器(gitk,gitx, git log --decorate --graph等…),find提交XYZ,看看…

 AA - BB - CC - DD - EE - FF - GG - II ... \ / QQ - UU - XYZ - JJ - MM 

有我的分支! 我知道QQ,UU,XYZ,JJ和MM都属于同一个分支,我应该看看他们的日志消息的细节。 我知道GG将是一个合并提交,并有分支的名字,希望跟跟踪器中的问题有关。

如果出于某种原因,我想find一个旧分支,我可以运行git log并在合并提交中search分支名称。 即使在非常大的存储库上也足够快。

当我说分支机构自己存档时,这就是我的意思。

为每个分支添加标签会增加不必要的工作来完成任务(一个应该被无情精简的关键过程),用数百个非常偶然有用的标签来粘贴标签列表(不是说性能,而是人的可读性)对考古学甚至是非常有用的。

我的方法是用“trash_”前缀重命名我不关心的所有分支,然后使用:

 git branch | grep -v trash 

要保留活动分支的颜色,需要:

 git branch --color=always | grep --color=never --invert-match trash 

你可以使用一个脚本来存档你的分支

archbranch

它使用前缀archive /为您创build一个标签,然后删除该分支。 但在使用之前请检查代码。


用法 – $/your/location/of/script/archbranch [branchname] [defaultbranch]

如果要运行脚本而不写入位置,请将其添加到path中

那你可以打电话过来

 $ archbranch [branchname] [defaultbranch] 

[defaultbranch]是归档完成后的分支。 颜色编码有一些问题,但其他方面则应该起作用。 我一直在项目中使用它很长一段时间,但它仍在开发中。