我的git存储库中有一些旧的分支,不再处于活动开发状态.我想存档分支,以便它们在运行git branch -l -r时默认不显示.我不想删除它们,因为我想保留历史记录.我怎样才能做到这一点?
我知道可以在refs/heads之外创建一个ref.例如,refs/archive/old_branch.这样做会有什么后果吗?
Jer*_*all 366
我相信这样做的正确方法是标记分支.如果您在标记它之后删除了分支,那么您已经有效地保留了分支,但它不会使分支列表混乱.
如果您需要返回分支机构,请查看标签.它将有效地从标签恢复分支.
要归档和删除分支:
git tag archive/<branchname> <branchname>
git branch -d <branchname>
Run Code Online (Sandbox Code Playgroud)
一段时间后恢复分支:
git checkout -b <branchname> archive/<branchname>
Run Code Online (Sandbox Code Playgroud)
分支的历史记录将完全保留,就像标记它一样.
Ste*_*eve 117
Jeremy的答案原则上是正确的,但恕我直言他指定的命令并不完全正确.
以下是如何将分支归档到标记而无需签出分支(因此,在删除该分支之前,无需签出到另一个分支):
> git tag archive/<branchname> <branchname>
> git branch -D <branchname>
Run Code Online (Sandbox Code Playgroud)
以下是恢复分支的方法:
> git checkout -b <branchname> archive/<branchname>
Run Code Online (Sandbox Code Playgroud)
sni*_*nip 21
是的,您可以使用一些非标准前缀创建一个引用git update-ref.(例如git update-ref refs/archive/old-topic your-commit)
与普通的分支或标签不同,这些引用不会在通常情况下显示git branch,git log也不会git tag(虽然您可以看到它们git log --all).
创建一个ref比仅复制SHA1有一些优势.SHA1在短期内已经足够了,但是没有任何参考的提交将在3个月后(或者没有reflog的几周)进行GC测试,更不用说手动了git for-each-ref.使用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
Run Code Online (Sandbox Code Playgroud)
此外,您可能希望配置遥控器,例如git gc --prune自动推送(或push = +refs/archive/*:refs/archive/*一次性推送).
编辑:通过@ap找到同一个想法的perl实现:git push origin refs/archive/*:refs/archive/*
编辑^ 2:找到一篇博客文章,其中Gitster自己使用相同的技术.
Aug*_*aas 18
您可以将分支存档在另一个存储库中.不太优雅,但我认为这是一个可行的选择.
git push git://yourthing.com/myproject-archive-branches.git yourbranch
git branch -d yourbranch
Run Code Online (Sandbox Code Playgroud)
Lia*_*iam 14
我做了,扩展史蒂夫的答案以反映遥控器上的变化
git tag archive/<branchname> <branchname>
git branch -D <branchname>
git branch -d -r origin/<branchname>
git push --tags
git push origin :<branchname>
Run Code Online (Sandbox Code Playgroud)
要从远程恢复,请参阅此问题.
这是别名:
arc = "! f() { git tag archive/$1 $1 && git branch -D $1;}; f"
Run Code Online (Sandbox Code Playgroud)
像这样添加:
git config --global alias.arc '! f() { git tag archive/$1 $1 && git branch -D $1;}; f'
Run Code Online (Sandbox Code Playgroud)
请记住已有git archive命令,因此您不能将其archive用作别名.
您还可以定义别名以查看"已归档"分支的列表:
arcl = "! f() { git tag | grep '^archive/';}; f"
Run Code Online (Sandbox Code Playgroud)
小智 5
我使用以下别名来隐藏存档的分支:
[alias]
br = branch --no-merge master # show only branches not merged into master
bra = branch # show all branches
Run Code Online (Sandbox Code Playgroud)
因此,git br要显示积极发展的分支机构,并git bra显示所有分支,包括"存档"分支.
我不会归档分支。换句话说,分支机构自己存档。您想要的是确保可以通过可靠的方式找到与考古学家相关的信息。可靠,因为它们有助于日常开发,并且不会在完成工作的过程中增加额外的步骤。也就是说,我不相信人们在完成分支后会记得添加标签。
这里有两个简单的步骤,它们将极大地帮助考古学和发展。
git merge --no-ff用来合并任务分支;你想要合并提交和历史泡沫,即使只有一次提交。就是这样。为什么?因为作为代码考古学家,我很少从想知道分支上做了什么工作开始。更常见的是,为什么在所有尖叫的九个地狱中,代码都是这样编写的?!我需要更改代码,但它有一些奇怪的功能,我需要把它们弄明白以避免破坏一些重要的东西。
下一步是git blame找到相关的提交,然后希望日志消息是解释性的。如果我需要更深入地挖掘,我会找出工作是否在一个分支中完成并阅读整个分支(以及它在问题跟踪器中的评论)。
让我们说git blame提交 XYZ的点数。我打开一个 Git 历史浏览器(gitk、GitX git log --decorate --graph、等等...),找到 commit XYZ 并查看...
AA - BB - CC - DD - EE - FF - GG - II ...
\ /
QQ - UU - XYZ - JJ - MM
Run Code Online (Sandbox Code Playgroud)
有我的分店!我知道 QQ、UU、XYZ、JJ 和 MM 都属于同一个分支,我应该查看他们的日志消息以获取详细信息。我知道 GG 将是一个合并提交,并且具有希望与跟踪器中的问题相关联的分支的名称。
如果出于某种原因,我想找到一个可以运行的旧分支git log并在合并提交中搜索分支名称。即使在非常大的存储库上它也足够快。
这就是我所说的分支归档本身的意思。
标记每个分支为完成工作增加了不必要的工作(一个应该无情地简化的关键过程),用数百个标签填充标签列表(不是说性能,而是人类可读性),这些标签只是偶尔有用,而且不是甚至对考古学非常有用。
| 归档时间: |
|
| 查看次数: |
60763 次 |
| 最近记录: |