如何归档git分支?

如何归档git分支?,git,Git,我的git存储库中有一些旧分支,它们不再处于活动开发中。我想归档这些分支,这样在运行git branch-l-r时它们就不会在默认情况下出现。我不想删除它们,因为我想保留历史记录。我该怎么做 我知道可以在refs/heads之外创建ref。例如,refs/archive/old_branch。这样做有什么后果吗?您可以将分支归档到另一个存储库中。不太优雅,但我认为这是一个可行的选择 git push git://yourthing.com/myproject-archive-branches.g

我的git存储库中有一些旧分支,它们不再处于活动开发中。我想归档这些分支,这样在运行
git branch-l-r
时它们就不会在默认情况下出现。我不想删除它们,因为我想保留历史记录。我该怎么做


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

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

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

我认为正确的方法是标记分支。如果在标记分支后删除该分支,则可以有效地保留该分支,但不会使分支列表混乱

如果您需要返回分支,只需查看标签即可。它将有效地从标记恢复分支

要存档和删除分支,请执行以下操作:

git tag archive/<branchname> <branchname>
git branch -d <branchname>
git标签存档/
吉特分行-d
要稍后恢复分支,请执行以下操作:

git checkout -b <branchname> archive/<branchname>
git签出-b存档/

分支的历史记录将与您标记它时完全相同。

杰里米的回答原则上是正确的,但他指定的命令并不完全正确

下面介绍如何将分支存档到标记中,而不必签出该分支(因此,在删除该分支之前不必签出到另一个分支):

>git标签存档/
>吉特分行-D
下面是如何恢复分支:

> git checkout -b <branchname> archive/<branchname>
>git签出-b存档/

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

[alias]
    br = branch --no-merge master # show only branches not merged into master
    bra = branch                  # show all branches
arcl   = "! f() { git tag | grep '^archive/';}; f"

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

您可以使用脚本为您存档分支

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


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

如果要在不向脚本写入位置的情况下运行脚本,请将其添加到路径中

那你可以打电话过来

$ archbranch [branchname] [defaultbranch]

[defaultbranch]
是归档完成后将转到的分支。颜色编码有一些问题,但另一个问题是它应该可以工作。我已经在项目中使用它很长时间了,但它仍在开发中。

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

这里有两个简单的步骤将极大地帮助考古学和发展

  • 始终使用
    git merge--no ff
    合并任务分支;您想要合并提交和历史泡泡,即使只是一次提交
  • 就这样。为什么?因为作为一名代码考古学家,我很少一开始就想知道在分支上做了什么工作。更常见的是,这就是为什么在所有尖叫的九个地狱中,代码都是这样写的?!我需要修改代码,但它有一些奇怪的特性,我需要把它们弄清楚,以避免破坏一些重要的东西

    下一步是查找相关的提交,然后希望日志消息是解释性的。如果我需要更深入地挖掘,我会找出这项工作是否是在一个分支中完成的,并将该分支作为一个整体阅读(以及它在问题跟踪程序中的评论)

    比如说,
    git-bull
    指向commit-XYZ。我打开一个Git历史浏览器(gitk、GitX、
    Git日志--decoration--graph
    ,等等),找到提交XYZ并查看

    AA - BB - CC - DD - EE - FF - GG - II ...
         \                       /
          QQ - UU - XYZ - JJ - MM
    
    这是我的分行!我知道QQ、UU、XYZ、JJ和MM都是同一个分支的一部分,我应该查看它们的日志消息以了解详细信息。我知道GG将是一个合并提交,并且有分支的名称,希望它与跟踪程序中的一个问题相关

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

    这就是我所说的分支自己归档的意思


    为每一个分支添加标签会为完成任务增加不必要的工作(这是一个关键的过程,应该被无情地简化),将标签列表(不是说性能,而是人类可读性)拼凑成数百个标签,这些标签只是偶尔有用,甚至对考古学来说都不是很有用。

    这里有一个别名:

    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
    用作别名

    您还可以定义别名以查看“已存档”分支的列表:

    [alias]
        br = branch --no-merge master # show only branches not merged into master
        bra = branch                  # show all branches
    
    arcl   = "! f() { git tag | grep '^archive/';}; f"
    

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

    git branch | grep -v trash
    
    (带外壳键绑定)

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

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

    是的,您可以使用创建带有一些非标准前缀的ref。e、 g

    • 归档分支:
      git update ref refs/Archive/old topic topic&&git branch-D topic
    • 恢复分支(如果需要):
      git分支主题refs/archive/old topic
    带有非标准前缀的引用(此处
    Refs/archive
    )不会出现在通常的
    git分支
    git日志
    git标记上。尽管如此,您仍然可以将它们与一起列出

    我使用以下别名:

    [别名]
    add archive=“!git update ref refs/archive/$(日期'+%Y%m%d-%s')”
    列表存档=对于每个引用--sort=-authordate--format='%(refname)%(objectname:short)%(contents:subject)'引用/存档/
    重新
    
    git status
    
    git checkout <branch_name> && git tag archive/<branch_name>
    
    git push origin --tags && git checkout main
    
    git branch -D <branch_name> && git push origin -d <branch_name>
    
    git checkout -b <branch_name> archive/<branch_name>
    
    git push --set-upstream origin <branch_name>