我如何归档git分支?

时间:2009-08-20 15:49:30

标签: git

我的git存储库中有一些旧的分支,不再处于活动开发状态。我想存档分支,以便它们在运行git branch -l -r时默认不显示。我不想删除它们,因为我想保留历史记录。我怎么能这样做?

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

12 个答案:

答案 0 :(得分:336)

我认为正确的方法是标记分支。如果你在标记它之后删除了分支,那么你已经有效地保留了分支,但它不会使分支列表混乱。

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

归档和删除分支:

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

稍后恢复分支:

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

分支的历史记录将完全保留,就像标记它一样。

答案 1 :(得分:107)

Jeremy的答案原则上是正确的,但恕我直言他指定的命令并不完全正确。

以下是如何将分支归档到标记而无需签出分支(因此,无需在删除该分支之前签出到另一个分支):

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

以下是恢复分支的方法:

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

答案 2 :(得分:16)

您可以将分支存档在另一个存储库中。不太优雅,但我认为这是一个可行的选择。

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

答案 3 :(得分:16)

是的,您可以使用git update-ref创建带有一些非标准前缀的引用。 (例如git update-ref refs/archive/old-topic your-commit

与普通分支或代码不同,这些引用不会出现在通常的git branchgit loggit tag上(虽然您可以使用git log --allgit for-each-ref如下所示。)

创建ref比仅复制SHA1有一些优势。 SHA1足以满足短期需求,但没有任何参考的提交将是GC'd after 3 months (or a couple of weeks without reflog),更不用说手动git gc --prune了。使用refs的提交对GC来说是安全的。

我使用以下别名:

[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

此外,您可能希望将push = +refs/archive/*:refs/archive/*等遥控器配置为自动推送(或git push origin refs/archive/*:refs/archive/*一次性推送。)

修改@ap找到了相同构思的perl实现:git-attic

编辑^ 2:找到a blog post Gitster自己使用相同的技术。

答案 4 :(得分:12)

扩展史蒂夫的answer以反映遥控器的变化,我做了

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

要从遥控器恢复,请参阅this question

答案 5 :(得分:8)

这是别名:

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"

about adding aliases

答案 6 :(得分:5)

我使用以下别名来隐藏存档的分支:

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

所以git br显示积极开发的分支,git bra显示所有分支,包括“已归档”分支。

答案 7 :(得分:3)

我不会归档分支机构。换句话说,分支机构归档自己。您想要的是确保通过可靠的方法找到与考古学家相关的信息。可靠的是,它们有助于日常开发,并且不会为完成工作的过程增加额外的步骤。也就是说,我不相信人们会记得在他们完成分支后添加标签。

这里有两个简单的步骤,可以极大地帮助考古学的发展。

  1. Link each task branch with an associated issue in the issue tracker using a simple naming convention
  2. 始终使用git merge --no-ff合并任务分支;你想要合并提交和历史泡沫,即使只是一次提交。
  3. 那就是它。为什么?因为作为代码考古学家,我很少开始想知道在分支上做了什么工作。更常见的是这就是为什么所有尖叫的九个地狱都是这样编写的代码?!我需要更改代码,但它有一些奇怪的功能,我需要把它们拼出来避免破坏重要的东西。

    下一步是git blame来查找关联的提交,然后希望日志消息是解释性的。如果我需要深入挖掘,我会发现工作是否在一个分支中完成,并将整个分支读起来(以及它在问题跟踪器中的评论)。

    让我们在提交XYZ时说git blame分。我打开一个Git历史浏览器(gitk,GitX,git log --decorate --graph等...),找到提交XYZ并看到......

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

    我的分店!我知道QQ,UU,XYZ,JJ和MM都属于同一个分支,我应该查看他们的日志消息以获取详细信息。我知道GG将是一个合并提交,并且具有分支的名称,希望它与跟踪器中的问题相关联。

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

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

    标记每个分支会增加不必要的工作以完成工作(一个应该无情地简化的关键过程),使用数百个偶尔非常有用的标记来标记标记列表(不是说性能,而是人类的可读性)并且对考古学来说甚至不是很有用。

答案 8 :(得分:2)

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

git branch | grep -v trash

(使用shell键绑定)

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

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

答案 9 :(得分:2)

第 0 步。检查以确保工作树是干净的,以免 失去任何工作:

git status

步骤 1。从本地存储库的根目录,检查分支并 然后将其标记为存档:

git checkout <branch_name> && git tag archive/<branch_name>

第 2 步。上传标签到远程,之前一定要在另一个分支 继续,例如 main:

git push origin --tags && git checkout main

第 3 步。从本地和远程存储库中删除分支:

git branch -D <branch_name> && git push origin -d <branch_name>

您应该将 <branch_name> 替换为分支名称的位置 归档,origin 带有远程存储库的名称 如果不是 origin

评论:

  • 步骤 1 之前和之后,您可能需要运行 git tag 来注意 添加了标签。

  • 步骤 3 之前和之后,您可能想观看 https://github.com/<github-username>/<github-repository-name>/branches 和/或运行 git branch -a 来注意分支是如何被删除的。

  • 要恢复分支:

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

关注

git push --set-upstream origin <branch_name>

参考文献:
https://gist.github.com/zkiraly/c378a1a43d8be9c9a8f9
https://dev.to/clsource/archiving-git-branches-3k70

答案 10 :(得分:1)

您可以使用将为您归档分支的脚本

archbranch

它使用前缀archive /为您创建标记,然后删除分支。但在使用之前请检查代码。


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

如果您想在不编写位置的情况下运行脚本,请将其添加到路径

然后你可以通过

来调用它
$ archbranch [branchname] [defaultbranch]

[defaultbranch]是归档完成后要转到的分支。颜色编码存在一些问题,但除此之外它应该有效。我已经在项目中使用了很长时间,但它仍处于开发阶段。

答案 11 :(得分:0)

我有时将分支归档如下:

  1. 生成补丁文件,例如format-patch <branchName> <firstHash>^..<lastHash>(使用git log <branchName>获取firstHash和lastHash。
  2. 将生成的补丁文件移动到文件服务器上的目录中。
  3. 删除分支,例如git branch -D <branchName>

当您需要再次使用分支时,“应用”补丁;但是,根据目标分支的状态,应用补丁文件(请参见git am)可能会很困难。从好的方面来说,这种方法的好处是可以对分支的提交进行垃圾收集,并在您的存储库中节省空间。