为备份而创建私有的mercurial/git分支?

5

在Git或Mercurial中是否可以创建一个不可见的分支,我可以用作备份?例如,在一天结束时,我有未完成的工作(甚至可能剩下语法错误),但我希望它在在线存储库中得到备份,而不会让其他人感到困扰。

11个回答

7
默认情况下,git clonegit fetch/merge仅下载refs/heads/*中的引用。因此,您推送到其他位置的任何内容都不会被他人下载(除非他们明确要求或执行类似于git clone --mirror的操作)。例如,您可以执行以下操作:
git push origin HEAD:refs/koen/my_work

推送你目前的提交。使用完整的refspec,你也可以从另一个checkout中拉取它:

git pull origin refs/koen/my_work

为了自动推送您的HEAD,您可以做如下操作:
[remote "origin"]
    url = git@github.com:pieter/gitx.git
    push = :
        push = refs/heads/*:refs/koen/*

这将把你的所有分支推送到远程,而不会打扰其他人。它还将保持您习惯的默认推送行为。如果您不想要这个功能,请删除push=:行。


4
Git允许您非常容易地镜像您的存储库;假设您有一个名为“backup”的远程repo,例如:
git remote add --mirror backup server.com:/home/koen/backup_repo.git

然后备份就像这样简单:
git push backup

几点注意事项:

  • 如果在添加远程仓库时没有使用 --mirror,则在推送命令中使用 --mirror
  • 远程仓库应该是一个“裸”仓库(因为你要将代码推送到它里面)
  • 查看 git pushgit remote 的相关帮助文档,了解如何使用 --mirror

使用现代版本的Git,您应该使用以下remote-add命令:git remote add --mirror=push backup server.com:/home/koen/backup_repo.git(请注意镜像选项的更改)。 - Steve Hollasch

3

你推送到共享仓库的所有内容都是公开可见/可用的。你有两个简单的选择:

  • 在另一个位置创建自己的第二个仓库,并在每天结束时将开发分支推送到那里。你不会将开发分支推送到其他人使用的稳定分支。

  • 第二个选项不涉及拥有整个第二个仓库,但需要更多的工作量,即导出补丁文件。标准的git电子邮件补丁方法将保留所有提交,以防您也想备份该模式。压缩补丁并上传到某个地方。


2
如果您有两个仓库的远程克隆,就可以完成此操作:
stable
unstable

在完成一个功能之前,将其推送到不稳定的分支(备份)。一旦功能完成,将该分支推送到稳定分支。反复执行此操作。


1

我认为这更取决于您的存储库如何可见以及您拥有的权限。原则上,您只需要一个临时分支用作“保存区”,将其推送到中央仓库-我想您已经知道了。是否有一种通用的方法来标记一个分支为“不可见”?我不认为有,尽管您可以尝试将本地主引用推送到另一端的奇怪命名的引用中,例如:

git push central refs/heads/master:refs/remotes/tmp/master

这将尝试创建“refs/remotes/tmp/master”,这是一个有效的引用名称,但通常不被认为是一个分支。例如,如果它出现在refs/heads/下的一个分支的历史记录中,gitweb将显示这样的引用,但不会显示所有远程引用的列表。

或者,直接咬紧牙关,推送到一个名为“probably-broken-use-at-your-peril”的可见分支;)


1

使用Mercurial进行合并时,您会合并所有更改集,包括那些“仅用于保存未完成工作”的提交。如果您不希望它们出现在树中,请不要提交它们。

对于Git而言,据我所知,默认行为也是相同的,编辑提交历史以删除它们也很麻烦。

因此,建议使用rsync似乎是更好的选择。


1
这就是为什么在个人分支上进行开发很常见/流行,也是使分布式版本控制系统变得强大的主要因素。在提交之前,您可以切换到生产分支,重新基于或合并您希望看到的方式,然后仅推送您想要的更改。Rsync不是处理该问题的好选择。 - Jeff Ferland

1

TortoiseHg的最新版本允许您搁置您的更改

简而言之:

搁置的更改会从工作目录中物理删除,直到您取消搁置它们。这意味着您可以在搁置更改的情况下构建项目并对其运行测试。这比在构建时选择更改更安全,因为您可以测试提交的更改是否有效。

搁置更改还有助于删除部分完成的工作,以确保它不会干扰您正在进行的其他更改的调试。


1

使用 Git 时,通常有私有仓库,非裸库,意味着它具有工作目录。您可以在此创建新的提交、应用补丁、从其他仓库拉取/获取等操作。该仓库托管在您的私有计算机上。

然后您有公共仓库,裸库,这意味着它没有工作目录。当您的工作稳定下来时,您可以从私有仓库推送到此公共仓库(例如可托管在 Git 托管网站之一,如repo.or.cz, GitHubGitorious)。您可以将 私有 开发仓库中的 子分支 推送到此 公共 发布仓库(例如 Git 维护者 Junio C Hamano 不会将特性分支推送到公共的git.git存储库中)。其他人从这个公共仓库中获取文件。

这种分离有一个优点,即您可以修复提交(例如使用"git commit --amend"), 这些提交尚未推送到公共存储库,并且重写仅存在于私有开发存储库中的历史部分。


1

虽然这不是私有的(您公司中的任何人都可以访问它们,但默认情况下不会很烦人),但这是我所做的:

在~/.gitconfig文件中

[alias]
  backup = !git push -v origin +refs/heads/*:refs/wip/`git config --get user.email`/*

这样,您可以随时在本地仓库上运行:

git backup

所有本地分支(在refs/heads下)都将被无条件地推送到“origin”仓库的refs/wip/your_email/命名空间下(与push -f相同)。

一旦您准备好推送到origin/master,如果您一直在使用它来备份您的工作进度,那么推送速度将非常快,因为大多数(或全部)SHA1对象已经在origin服务器上了。

请注意,您需要定期清除备份,以便原始存储库可以垃圾回收。请参见:

git ls-remote origin refs/wip/`git config --get user.email`/*

这将为您提供一个已推送到备份的分支列表,以便您知道/自动化清理哪些内容。


0

这并不是SCM的真正目的。也许使用rsync将其上传到服务器会是一个更好的主意?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接