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

git:在工作副本之间推送的简单解决方案,git,repository,dvcs,git-push,Git,Repository,Dvcs,Git Push,我想做的是:在我的(ssh远程访问)大学机器上,我在一个项目上工作,我已经将该项目置于git源代码控制之下(git init,然后git commit-a在每次更改之后,一切正常)。现在我想在家里的私人机器上做这个项目。应该很容易,因为git是分布式vcs,对吗 我读了一篇文章,其中建议在大学里做一次git-pull,在家里完成修改。那是行不通的,因为我家的机器无法远程访问。所以我想我应该在家里推一推git。这是可行的,但很复杂(需要在大学毕业后重新设置git,等等) 问题1:有没有比在我的设置

我想做的是:在我的(ssh远程访问)大学机器上,我在一个项目上工作,我已经将该项目置于git源代码控制之下(
git init
,然后
git commit-a
在每次更改之后,一切正常)。现在我想在家里的私人机器上做这个项目。应该很容易,因为git是分布式vcs,对吗

我读了一篇文章,其中建议在大学里做一次git-pull,在家里完成修改。那是行不通的,因为我家的机器无法远程访问。所以我想我应该在家里推一推git。这是可行的,但很复杂(需要在大学毕业后重新设置git,等等)

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

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

PS:我知道有一个post-receive-hook浮动在周围,它允许您推进非裸存储库。我试过了,但是效果不好,因为大学机器上的git版本已经很旧了(1.5.5.6),并且错过了钩子使用的一些命令。更新不是一个选项,我更喜欢没有第三方脚本的解决方案

  • 某种程度上总结了我尝试同步两个工作副本的经验。最终,我发现拥有一个裸存储库更自然、更简单。它不是SVN意义上的“主”存储库——例如,您可以在uni和home分别拥有一个和一个,并在它们之间进行推拉

  • 有人可能会发布将裸机存储库设置为推送目标的正确方法,但如果不查看文档,我只会删除工作副本并再次从裸机存储库克隆它


  • 您真的不应该推到签出分支,因为它有效地将地毯从远程工作副本下面拉出来。然后,很难确定工作树是否因为分支头移动而被修改,或者是否也存在局部更改,这些更改将因
    重置--hard
    而丢失

    最简单的方法是推到另一个分支。然后,当您可以访问远程计算机并需要对其进行操作时,可以将其合并到工作副本的签出分支(或将本地分支重新设置到该分支上)

    在家:

    git push origin HEAD:from-home
    
    从“工作”开始:

    git merge from-home
    
    您可以将配置设置为默认为特定的push refspec

    e、 g

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

    更好的方法是,如果要在每个位置使用工作副本,可以使用此技巧直接修改远程设备的远程设备,而不是专门重命名的分支

    因此,在origin上,创建一个名为“home”的远程设备——由于您的网络配置,您显然无法从中获取。那没关系

    在home上,告诉它,“当我推到origin时,让它更新origin的远程home:

    现在,事情变得非常顺利。从主页上运行
    git push origin
    ,然后转到origin,然后运行
    git status
    git branch-a-v
    ——您将看到类似这样的内容:“master在home/master后面3次提交,可以快速转发。”

    换句话说,使用home将更改推送到origin的远程命名home,在功能上与使用origin从home进行拉取相同


    这里的一个缺点是,当您在home上创建其他分支时,您需要不断地进行新的git配置设置。这是您为网络设置支付的开销。谢天谢地,这很简单,每次创建分支只发生一次。

    我通过使用解决了这个问题。在我的笔记本电脑上,我使用
    git pull
    ,以获得上游m个更改。这可以通过ssh正常工作。然后,我使用
    git bundle
    将本地更改放入一个bundle,将bundle文件复制到远程服务器,然后使用ssh将其复制到服务器,并从bundle文件中执行
    git pull

    从文件中:

    一些工作流要求一台机器上的一个或多个开发分支在另一台机器上复制,但这两台机器不能直接连接,因此需要交互式Git协议(Git、ssh、http)无法使用。此命令支持git fetch和git pull操作,方法是将对象和引用打包到原始计算机上的存档中,然后在通过某种方式(例如,通过sneakernet)移动存档后,使用git fetch和git pull将其导入另一个存储库。由于存储库之间不存在直接连接,用户必须为目标存储库持有的捆绑包指定基础:捆绑包假定基础中的所有对象都已位于目标存储库中

    我的存储库足够小,我可以使用
    --all
    将整个git树添加到捆绑包中。但是,如果您的存储库更大,您可能只想向捆绑包中添加最近的更改(例如,使用
    --since=10.days master
    ,以获得最后10天)。文档中有更多示例

    这是我的代码。在这种情况下,笔记本电脑和服务器都在同一个位置拥有存储库:
    ~/src/
    (这是一个非裸存储库,即工作副本)。服务器和笔记本电脑上都存在~/tmp目录

    TMPDIR=~/tmp
    cd ~/src
    git pull $server:~/src/
    git bundle create $TMPDIR/bundle --all
    rsync $TMPDIR/bundle $server:$TMPDIR
    ssh $server "cd ~/src;git pull $TMPDIR/bundle"
    
    此外,如果你的大学账户上有“裸”回购协议,你可以使用git clone的
    --local
    --referec
    
    git config remote.origin.push +master:home/master
    
    TMPDIR=~/tmp
    cd ~/src
    git pull $server:~/src/
    git bundle create $TMPDIR/bundle --all
    rsync $TMPDIR/bundle $server:$TMPDIR
    ssh $server "cd ~/src;git pull $TMPDIR/bundle"