我的git存储库中有一些旧的分支,不再处于活动开发状态。我想存档分支,以便它们在运行git branch -l -r时默认不显示。我不想删除它们,因为我想保留历史记录。我怎么能这样做?
我知道可以在refs / heads之外创建一个ref。例如,refs / archive / old_branch。这样做有什么后果吗?
答案 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 branch
,git log
或git tag
上(虽然您可以使用git log --all
或git 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"
答案 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)
我不会归档分支机构。换句话说,分支机构归档自己。您想要的是确保通过可靠的方法找到与考古学家相关的信息。可靠的是,它们有助于日常开发,并且不会为完成工作的过程增加额外的步骤。也就是说,我不相信人们会记得在他们完成分支后添加标签。
这里有两个简单的步骤,可以极大地帮助考古学和的发展。
git merge --no-ff
合并任务分支;你想要合并提交和历史泡沫,即使只是一次提交。那就是它。为什么?因为作为代码考古学家,我很少开始想知道在分支上做了什么工作。更常见的是这就是为什么所有尖叫的九个地狱都是这样编写的代码?!我需要更改代码,但它有一些奇怪的功能,我需要把它们拼出来避免破坏重要的东西。
下一步是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)
您可以使用将为您归档分支的脚本
它使用前缀archive /为您创建标记,然后删除分支。但在使用之前请检查代码。
用法 - $/your/location/of/script/archbranch [branchname] [defaultbranch]
如果您想在不编写位置的情况下运行脚本,请将其添加到路径
然后你可以通过
来调用它$ archbranch [branchname] [defaultbranch]
[defaultbranch]
是归档完成后要转到的分支。颜色编码存在一些问题,但除此之外它应该有效。我已经在项目中使用了很长时间,但它仍处于开发阶段。
答案 11 :(得分:0)
我有时将分支归档如下:
format-patch <branchName> <firstHash>^..<lastHash>
(使用git log <branchName>
获取firstHash和lastHash。git branch -D <branchName>
当您需要再次使用分支时,“应用”补丁;但是,根据目标分支的状态,应用补丁文件(请参见git am
)可能会很困难。从好的方面来说,这种方法的好处是可以对分支的提交进行垃圾收集,并在您的存储库中节省空间。