git:在工作副本之间推送的简单解决方案

Hei*_*nzi 14 git dvcs repository git-push

我想做什么:在我的(ssh远程访问)大学机器上,我处理一个项目,我已经放在git源代码控制下(git init然后git commit -a在每次更改后,一切正常).现在我想在家里的私人机器上处理该项目.应该很容易,因为git是一个分布式的vcs,对吧?

我阅读了git教程,建议git pull在大学里做一个在家里完成修改的教程.这是行不通的,因为我家里的机器无法远程访问.所以我以为我会git push在家做一个.这是有效的,但它很复杂(git reset之后需要在大学等),因为非裸存储库不是为推动而设计的.

问题1:是否有一种比在我的设置中添加额外的裸存储库更简单的方法(这意味着我有:(1)"主"裸存储库,(2)大学工作副本,(3)家庭工作副本)?
<Rant>如果我真的需要这个设置,我可以留在SVN.</ Rant>

问题2:如果真的需要这个设置,我如何创建那个裸存储库(git clone --bare我猜)并使其成为"主"存储库,即告诉git push应该去那里的工作副本.

PS:我知道有一个后置接收挂钩可以让你进入非裸存储库.我试过了,但由于大学机器上的git版本相当陈旧(1.5.5.6)并且错过了钩子使用的一些命令,因此效果不佳.更新不是一种选择,我更喜欢没有第三方脚本的解决方案.

CB *_*ley 14

你真的不应该推到检查分支,因为它有效地从远程工作副本下拉地毯.如果工作树被修改是因为分支头已移动或者如果还存在本地更改,那么很难解决reset --hard.

最简单的方法是推送到另一个分支.然后,当您有权访问远程计算机并需要对其进行处理时,可以将其合并到工作副本的checkout out分支(或将本地分支重新绑定到其上).

从家里:

git push origin HEAD:from-home
Run Code Online (Sandbox Code Playgroud)

从工作':

git merge from-home
Run Code Online (Sandbox Code Playgroud)

您可以将配置设置为默认为特定的push refspec.

例如

git config remote.origin.push +master:from-home
Run Code Online (Sandbox Code Playgroud)

裸存储库通常更自然.您可以从现有存储库中克隆它,或者我通常会执行的操作,初始化新存储库并从现有存储库中推送我想要的主分支.

更好的是,如果你要在每个位置使用工作副本,就是使用这个技巧直接修改遥控器的遥控器,而不是一个特殊重命名的分支.

因此,在原点上,创建一个名为"home"的遥控器 - 由于您的网络配置,您显然无法从中获取它.那没关系.

在家里,告诉它,"当我推到原点时,让它更新原点的远程命名主页:

git config remote.origin.push +master:home/master
Run Code Online (Sandbox Code Playgroud)

现在,事情变得非常光滑.从家里,跑步git push origin,到起源,跑步git statusgit branch -a -v- 你会看到的是:"主人在家庭/主人身后通过3次提交,可以快速转发."

换句话说,使用home将更改推送到原始远程命名的home,在功能上与使用origin从家中拉出相同.

这里的一个缺点是,当你在家里创建额外的分支时,你需要不断地进行新的git配置设置.这是您为网络设置支付的开销.值得庆幸的是,它很简单,只有每个分支创建一次.