私有mercurial / git分支备份?

时间:2009-04-21 10:52:50

标签: git version-control mercurial

是否可以在git或mercurial中创建一个不可见的分支,我可以用作备份?例如,在一天结束时,我有未完成的工作(甚至可能留下语法错误),但我希望它可以在网上备份到存储库中,而不会让其他人讨论剩下的混乱。

11 个答案:

答案 0 :(得分:7)

默认情况下git clonegit fetch/merge仅在refs / heads / *中下载引用。所以你推送到其他地方的任何东西都不会被其他人下载(除非他们明确要求他们或做git clone --mirror之类的事情)。例如,您可以这样做:

git push origin HEAD:refs/koen/my_work

推送您当前的提交。使用完整的refspec,您也可以从另一个结帐中取出它:

git pull origin refs/koen/my_work

要自动推送HEAD,您可以执行类似

的操作
[remote "origin"]
    url = git@github.com:pieter/gitx.git
    push = :
        push = refs/heads/*:refs/koen/*

将所有分支推送到远程而不会打扰任何其他人。它还将保留您习惯的默认推送行为。如果您不想这样,请删除push = :行。

答案 1 :(得分:4)

Git允许您非常轻松地镜像您的存储库;

假设您有一个名为“备份”的远程仓库,例如,

git remote add --mirror backup server.com:/home/koen/backup_repo.git

然后备份就像

一样简单
git push backup

一些注意事项:

  • 如果您在添加远程仓库时未使用--mirror,请在推送命令中使用--mirror
  • 远程仓库应该是一个“裸”存储库(因为你正在推进它)
  • 结帐有关--mirror
  • git pushgit remote帮助

答案 2 :(得分:3)

您推送到共享存储库的任何内容都将被普遍看到/可用。您的两个简单选项是:

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

  • 第二个选项不涉及拥有整个第二个存储库,但在一天结束时需要您做更多的工作,就是为您的工作导出补丁。标准的git email补丁方法将导致您保留所有提交,以防您想要备份该模式。压缩补丁并将其上传到某处。

答案 3 :(得分:2)

如果您有两个存储库的远程克隆,则可以完成此操作:

stable
unstable

推送到不稳定(备份),直到完成功能。功能完成后,将分支推入稳定状态。泡沫,冲洗,重复。

答案 4 :(得分:1)

使用mercurial,当您合并时,您将合并所有变更集,包括那些“仅用于保存未完成的工作”的提交。如果你不希望它们在树中结束,请不要提交它们。

对于git,据我所知,默认行为是相同的,编辑提交历史记录以删除它们也很烦人。

因此,正如所建议的那样,rsync看起来是更好的选择。

答案 5 :(得分:1)

最新版本的TortoiseHg允许您 shelve your changes

简而言之:

  

实际删除了搁置的更改   从工作目录直到你   取悦他们。这意味着你可以   构建您的项目并对其进行测试   被搁置的变化消失了。   这比选择更改更安全   在构建时,因为你可以测试   是否提交的更改是   有效的。

     

搁置更改也很有用   删除部分完成的工作   确保它不会干扰   您正在调试其他更改   制造

答案 6 :(得分:1)

我认为这更多地取决于您的存储库如何可见以及您拥有哪些权限。原则上,你只需要一个临时分支作为“保存区域”,你可以推送到集线器回购 - 我想你已经知道了。是否有将标记分支为“不可见”的通用方法?我不相信,虽然你可以尝试将你的本地头部引用到另一端的奇怪命名的引用,例如:

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

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

或者,只需咬住子弹并推到一个名为“可能破坏使用你自己的危险”的可见分支;)

答案 7 :(得分:1)

使用Git,您通常拥有 私有存储库,非裸,这意味着它确实有工作目录。您可以在那里创建新提交,应用补丁,从其他存储库中提取/提取。此存储库托管在您的私人计算机上。

然后你有 公共存储库,裸,这意味着它没有工作存储库。当您的工作稳定时,您可以从私有存储库推送到此公共存储库(例如,可以托管在诸如repo.or.czGitHubGitorious之类的git托管站点之一)。您只能将分支的子集从私有开发存储库推送到此 public 发布存储库(例如Git maintainer,Junio C Hamano,不会将功能分支推入公共git.git repositoris)。这个公共存储库是其他人从中获取的地方。

这种分离的优点是你可以修复未被推送到公共存储库的提交(例如使用“git commit --amend”),否则重写仅存在于私有开发存储库中的历史部分。

答案 8 :(得分:1)

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

在〜/ .gitconfig

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

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

git backup

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

一旦你准备好推送到origin / master,如果你一直用它来备份正在进行的工作,那么推送将非常快,因为大多数(所有)SHA1对象都已经在原始服务器。

请注意,您有时会想要清除备份,以便原始仓库可以垃圾收集内容。参见:

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

这将为您提供已推送到备份的分支列表,以便您了解/自动清理要清理的内容。

答案 9 :(得分:0)

这不是SCM的真正目的。也许将rsync这样的内容上传到服务器会更好吗?

答案 10 :(得分:0)

在我们的mercurial项目中,我们使用多个分支。默认分支就像一个“主干”。每次我开始一个功能,我都会分支并在那里发展。我承诺,推动,去另一个地方,拉,提交,推。默认分支保持不动,其他人不会分支我的分支。当我完成后,我将分支合并为默认值。