在Git或Mercurial中是否可以创建一个不可见的分支,我可以用作备份?例如,在一天结束时,我有未完成的工作(甚至可能剩下语法错误),但我希望它在在线存储库中得到备份,而不会让其他人感到困扰。
在Git或Mercurial中是否可以创建一个不可见的分支,我可以用作备份?例如,在一天结束时,我有未完成的工作(甚至可能剩下语法错误),但我希望它在在线存储库中得到备份,而不会让其他人感到困扰。
git clone
和git fetch/merge
仅下载refs/heads/*中的引用。因此,您推送到其他位置的任何内容都不会被他人下载(除非他们明确要求或执行类似于git clone --mirror
的操作)。例如,您可以执行以下操作:git push origin HEAD:refs/koen/my_work
推送你目前的提交。使用完整的refspec,你也可以从另一个checkout中拉取它:
git pull origin refs/koen/my_work
[remote "origin"]
url = git@github.com:pieter/gitx.git
push = :
push = refs/heads/*:refs/koen/*
这将把你的所有分支推送到远程,而不会打扰其他人。它还将保持您习惯的默认推送行为。如果您不想要这个功能,请删除push=:
行。
git remote add --mirror backup server.com:/home/koen/backup_repo.git
git push backup
几点注意事项:
--mirror
,则在推送命令中使用 --mirror
git push
和 git remote
的相关帮助文档,了解如何使用 --mirror
你推送到共享仓库的所有内容都是公开可见/可用的。你有两个简单的选择:
在另一个位置创建自己的第二个仓库,并在每天结束时将开发分支推送到那里。你不会将开发分支推送到其他人使用的稳定分支。
第二个选项不涉及拥有整个第二个仓库,但需要更多的工作量,即导出补丁文件。标准的git电子邮件补丁方法将保留所有提交,以防您也想备份该模式。压缩补丁并上传到某个地方。
stable
unstable
在完成一个功能之前,将其推送到不稳定的分支(备份)。一旦功能完成,将该分支推送到稳定分支。反复执行此操作。
我认为这更取决于您的存储库如何可见以及您拥有的权限。原则上,您只需要一个临时分支用作“保存区”,将其推送到中央仓库-我想您已经知道了。是否有一种通用的方法来标记一个分支为“不可见”?我不认为有,尽管您可以尝试将本地主引用推送到另一端的奇怪命名的引用中,例如:
git push central refs/heads/master:refs/remotes/tmp/master
这将尝试创建“refs/remotes/tmp/master”,这是一个有效的引用名称,但通常不被认为是一个分支。例如,如果它出现在refs/heads/下的一个分支的历史记录中,gitweb将显示这样的引用,但不会显示所有远程引用的列表。
或者,直接咬紧牙关,推送到一个名为“probably-broken-use-at-your-peril”的可见分支;)
使用Mercurial进行合并时,您会合并所有更改集,包括那些“仅用于保存未完成工作”的提交。如果您不希望它们出现在树中,请不要提交它们。
对于Git而言,据我所知,默认行为也是相同的,编辑提交历史以删除它们也很麻烦。
因此,建议使用rsync似乎是更好的选择。
TortoiseHg的最新版本允许您搁置您的更改。
简而言之:
搁置的更改会从工作目录中物理删除,直到您取消搁置它们。这意味着您可以在搁置更改的情况下构建项目并对其运行测试。这比在构建时选择更改更安全,因为您可以测试提交的更改是否有效。
搁置更改还有助于删除部分完成的工作,以确保它不会干扰您正在进行的其他更改的调试。
使用 Git 时,通常有私有仓库,非裸库,意味着它具有工作目录。您可以在此创建新的提交、应用补丁、从其他仓库拉取/获取等操作。该仓库托管在您的私有计算机上。
然后您有公共仓库,裸库,这意味着它没有工作目录。当您的工作稳定下来时,您可以从私有仓库推送到此公共仓库(例如可托管在 Git 托管网站之一,如repo.or.cz, GitHub或Gitorious)。您可以将 私有 开发仓库中的 子分支 推送到此 公共 发布仓库(例如 Git 维护者 Junio C Hamano 不会将特性分支推送到公共的git.git
存储库中)。其他人从这个公共仓库中获取文件。
这种分离有一个优点,即您可以修复提交(例如使用"git commit --amend"), 这些提交尚未推送到公共存储库,并且重写仅存在于私有开发存储库中的历史部分。
虽然这不是私有的(您公司中的任何人都可以访问它们,但默认情况下不会很烦人),但这是我所做的:
在~/.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`/*
这将为您提供一个已推送到备份的分支列表,以便您知道/自动化清理哪些内容。
git remote add --mirror=push backup server.com:/home/koen/backup_repo.git
(请注意镜像选项的更改)。 - Steve Hollasch