5

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

4

11 回答 11

7

默认情况下git clonegit fetch/merge仅下载 refs/heads/* 中的 refs。所以你推送到其他地方的任何东西都不会被其他人下载(除非他们明确要求他们或做类似的事情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 = :行。

于 2009-04-21T16:10:03.747 回答
4

Git allows you to mirror your repository very easily;

Let's say you have a remote repo called 'backup', e.g.,

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

Then backing up is as easy as

git push backup

A few notes:

  • if you didn't use --mirror when adding the remote repo, then use --mirror in your push command
  • the remote repo should be a "bare" repository (since you're pushing into it)
  • checkout the git push and git remote help regarding --mirror
于 2009-04-21T13:15:41.577 回答
3

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

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

  • 第二个选项不涉及拥有完整的第二个存储库,但最终需要您完成更多工作,即为您的工作导出补丁。标准的 git email patch 方法将导致您的所有提交得到维护,以防您也想备份该模式。压缩补丁并将其上传到某处。

于 2009-05-19T16:54:03.963 回答
2

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

stable
unstable

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

于 2009-04-21T11:40:49.307 回答
1

虽然这不是私人的(您公司中的任何人都可以找到他们,只是默认情况下不是,所以这并不烦人),这就是我所做的:

在 ~/.gitconfig

[别名]
  备份 = !git push -v origin +refs/heads/*:refs/wip/`git config --get user.email`/*

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

git backup

您的所有本地分支(无论如何都在 refs/heads 下)将无条件地推送到 refs/wip/your_email/ 命名空间下的“原始”存储库(与 push -f 相同)。

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

请注意,有时您会想要清除备份,以便原始存储库可以垃圾收集东西。看:

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

这将为您提供已推送到备份的分支列表,因此您可以知道/自动化要清理的内容。

于 2009-05-19T16:37:57.073 回答
1

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

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

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

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

于 2009-04-21T23:02:38.560 回答
1

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

简而言之:

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

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

于 2009-04-21T12:18:23.273 回答
1

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

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

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

于 2009-04-21T11:16:41.160 回答
1

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

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

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

于 2009-04-25T20:51:57.597 回答
0

这不是 SCM 的真正目的。也许像rsync这样的东西将它上传到服务器会是一个更好的主意?

于 2009-04-21T10:56:49.927 回答
0

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

于 2009-04-23T16:11:43.887 回答