2010-01-24 31 views
13

我想要做什么:在我的(SSH远程访问)大学机器,我对我所每次更改后的Git源代码控制(git init,然后git commit -a下把项目工作,一切正常)。现在我想在家里的私人机器上开展这个项目。应该很容易,因为git是一个分布式的vcs,对吧?的git:对工作拷贝之间的推动简单的解决方案

我读了git tutorial,建议在大学做git pull以在家中完成这些更改。这是行不通的,因为我家里的机器不能远程访问。所以我想我会在家里做一个git push。这有效,但它很复杂(在大学之后需要git reset等),since non-bare repositories are not designed for pushing

问题1:是否有比添加额外裸存储库到我的设置(这意味着我有:(1)“主”裸仓库,(2)大学工作副本,( 3)家庭工作副本)?
< Rant>如果我真的需要这个设置,我可以留在SVN中。 < /兰特>

问题2:如果真的需要的设置,我如何创建一个纯仓库(git clone --bare,我猜)和使其成为“主”库,即告诉工作副本git push应该去那里

PS:我知道有一个post-receive钩子可以让你进入非裸仓库。我试过了,但是因为大学机器上的git版本比较旧(1.5.5.6),并且没有使用钩子所使用的一些命令,所以效果不佳。更新不是一种选择,我宁愿没有第三方脚本的解决方案。

+0

@rant:但是如果你忘记更新一次,svn不能重新绑定。 – 2010-01-24 22:24:50

回答

12

你真的不应该推到检出分支,因为它有效地从远程工作副本下拉地毯。那么很难确定工作树是否被修改,因为分支头已经移动,或者如果也有本地改变,将会由于reset --hard而丢失。

最简单的事情就是推到不同的分支。当你有权访问远程机器并需要使用它时,你可以将它合并到工作副本的结帐分支(或重新绑定本地分支)。

从家里:

git push origin HEAD:from-home 

从 '工作':

git merge from-home 

你可以设置你的配置默认为特定的Push的Refspec。

例如

git config remote.origin.push +master:from-home 

裸仓库通常更自然。您可以从现有的存储库克隆它,或者我通常做的,初始化一个新的存储库,并从现有的存储库中推送我想要的主分支。

更好的是,如果你打算在每个位置使用工作副本,就是用这个招数直接修改遥控器的遥控器,而不是专门改名的分支。

因此,根据来源,创建一个名为“家”的远程 - 显然,由于您的网络配置,无法从中获取它。这并不重要。

回家,告诉它,“当我推到原点,有它更新起源的远程名为home

git config remote.origin.push +master:home/master 

现在,事情变得很光滑从家里跑git push origin,去并运行git statusgit branch -a -v - 您将看到的内容如下所示:“主人通过3次提交回到家/主人并且可以快速转发。”

换句话说,使用home将更改推送到原点的远程命名为home,在功能上与使用原点t相同o从家里拉出来。

这里的一个缺点是,当你在家中创建额外的分支时,你需要不断地做新的git配置设置。这是您为网络设置支付的开销。谢天谢地,这很简单,只有每个分支创建一次。

+0

另外,如果您在大学帐户上有“裸机”回购,则可以使用git-clone的“--local”或“--reference”标志来消除多个克隆的资源消耗。 – 2010-01-24 22:24:13

+1

'--local'对于本地克隆是自动的。 – 2010-01-24 22:37:49

+0

很好的答案,@Charles。我发现你可以用它来推送一个名为_remote_的引用,它更加真棒和透明,我进一步扩展了它。 – jcwenger 2013-08-29 15:26:26

1
  1. This question总结了我尝试同步两个工作副本的经验。最终我认为有一个裸仓库更自然简单。它不是SVN意义上的“主要”存储库 - 例如,您可以在单一和家中有一个存储库,并在这些存储库之间进行推送。

  2. 有人可能会发布正确的方式来将裸仓库设置为您的推送目标,但是如果不查看文档,我会简单地删除工作副本并将其从裸仓库再次克隆。

相关问题