我的git存储库中有一些旧的分支,它们不再处于活跃的开发状态。我想存档这些分支,这样它们在运行git branch -l -r时默认不会显示。我不想删除它们,因为我想保留历史。我该怎么做呢?
我知道可以在refs/heads之外创建一个ref。例如:refs/archive/old_branch。这样做有什么后果吗?
我的git存储库中有一些旧的分支,它们不再处于活跃的开发状态。我想存档这些分支,这样它们在运行git branch -l -r时默认不会显示。我不想删除它们,因为我想保留历史。我该怎么做呢?
我知道可以在refs/heads之外创建一个ref。例如:refs/archive/old_branch。这样做有什么后果吗?
当前回答
把史蒂夫的回答扩展到遥控器上的变化,我做到了
git tag archive/<branchname> <branchname>
git branch -D <branchname>
git branch -d -r origin/<branchname>
git push --tags
git push origin :<branchname>
要从远程进行恢复,请参见此问题。
其他回答
我不会归档分支。换句话说,分支将自己存档。你想要的是确保考古学家的相关信息可以通过可靠的方法找到。可靠之处在于它们有助于日常开发,并且不会在完成工作的过程中增加额外的步骤。也就是说,我不相信人们在使用完分支之后还会记得添加标签。
这里有两个简单的步骤,将极大地帮助考古和发展。
使用简单的命名约定将每个任务分支与问题跟踪器中的关联问题链接起来。 总是使用git merge——no-ff来合并任务分支;你需要合并提交和历史记录气泡,即使只是一次提交。
就是这样。为什么?因为作为代码考古学家,我很少一开始就想知道在一个分支上做了什么工作。更常见的是,为什么在所有尖叫的九个地狱代码是这样写的?!我需要更改代码,但它有一些奇怪的功能,我需要把它们弄清楚,以避免破坏一些重要的东西。
下一步是git责备找到相关的提交,然后希望日志消息是解释性的。如果我需要深入挖掘,我将找出工作是否在一个分支中完成,并从整体上阅读该分支(以及问题跟踪器中的注释)。
我们说git责备点在提交XYZ。我打开一个Git历史浏览器(gitk, GitX, Git log -装饰-图形,等等…),找到提交XYZ,然后看到…
AA - BB - CC - DD - EE - FF - GG - II ...
\ /
QQ - UU - XYZ - JJ - MM
这是我的树枝!我知道QQ, UU, XYZ, JJ和MM都是同一个分支的一部分,我应该查看他们的日志消息以了解详细信息。我知道GG将是一个合并提交,并有分支的名称,希望与跟踪器中的问题相关联。
如果,出于某种原因,我想找到一个旧的分支,我可以运行git log并在合并提交中搜索分支名称。即使在非常大的存储库上,它也足够快。
这就是我所说的分支自己归档的意思。
给每个分支加标签会给完成工作增加不必要的工作(这是一个应该被无情地简化的关键过程),用数百个偶尔有用的标签混淆标签列表(不是说性能,而是人类的可读性),甚至对考古学都没有多大用处。
我使用以下别名隐藏归档的分支:
[alias]
br = branch --no-merge master # show only branches not merged into master
bra = branch # show all branches
因此,git br显示正在开发的分支,git bra显示所有分支,包括“存档”的分支。
杰里米的回答原则上是正确的,但恕我直言,他指定的命令不太正确。
下面是如何在不签出分支的情况下将一个分支归档到一个标签中(因此,在删除该分支之前,不必签出到另一个分支):
> 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 branch -d -r origin/<branchname>
git push --tags
git push origin :<branchname>
要从远程进行恢复,请参见此问题。
是的,你可以使用git update-ref创建一个带有非标准前缀的ref。如。
归档分支:git update-ref refs/ Archive /old-topic topic && git branch -D topic 恢复分支(如果需要):git分支topic refs/archive/old-topic
带有非标准前缀的引用(这里是Refs /archive)不会出现在通常的git分支,git日志或git标签上。不过,您可以使用git for-each-ref列出它们。
我使用以下别名:
[alias]
add-archive = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')"
list-archive = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/
rem = !git add-archive
lsrem = !git list-archive
此外,你可能想要配置像push = +refs/archive/*:refs/archive/*这样的远程来自动推送归档的分支(或者只指定一个推送,比如git push origin refs/archive/*:refs/archive/*)。
另一种方法是在删除分支之前在某个地方写下SHA1,但它有局限性。没有任何引用的提交将在3个月后被GC - d(或几个星期后没有reflog),更不用说手动的git GC -prune。由refs指向的提交对GC是安全的。
编辑:通过@ap: git-attic找到了一个相同思想的perl实现
编辑^2:在一篇博客文章中,Gitster自己也使用了同样的技术。他把它命名为git hold。