2023-11-29 09:00:07

如何归档git分支?

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

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


当前回答

是的,你可以使用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。

其他回答

步骤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>与分支的名称 要存档,并将原点与远程存储库的名称联系起来 如果不是原点。

评论:

在第1步之前和之后,你可能想要运行git标记来注意 添加标签。 在第三步之前和之后,你可能想要观看 https://github.com/ < github-username > / < github-repository-name > /分支 和/或运行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

在Git中,分支只是一个指向某个提交的指针。因此,删除一个分支只会删除一个指针,即使分支从未合并,也不会删除相关的代码。因此,“归档”本地分支就像记住指针名称一样简单(提交哈希)。你可以在。/git/refs/heads目录下找到这些信息。或者,您可以简单地将分支到提交的映射复制到如下所示的文本文件中。

git branch -v > /path/to/backup/branches.txt

删除分支之后,可以使用以下命令在本地恢复它。

git branch <branch_name> <commit_hash>

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

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

归档并删除分支:

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

在一段时间后恢复分支:

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

分支的历史记录将被保留,就像您标记它时一样。

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

git branch | grep -v trash

(带壳键绑定)

为了保持活跃分支的颜色,我们需要:

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

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

下面是如何在不签出分支的情况下将一个分支归档到一个标签中(因此,在删除该分支之前,不必签出到另一个分支):

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

下面是如何恢复一个分支:

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