我的工作流程基本上是:
现在我想将更改与桌面同步。尝试git push desktop.local:~/my-repo
会失败,因为the master branch is already checked out。我知道有两个解决方案:
在我的电脑上的另一个目录中创建第三个裸存储库,并从那里更新两个工作副本。但是单个中央存储库检查出两个工作副本听起来像...... SVN!笨拙的,因为我不能只使用svn update
和svn commit
来与这个中央存储库同步 - 需要额外的步骤来实际更新中央存储库中提交给Git中工作副本的更改。
推送到单独的分支,并将该分支合并到我的桌面工作副本中。这不是太糟糕,但是......
...我不明白的是:如果我只是通过SSH连接桌面PC并发出git pull laptop.local:~/my-repo
,它就可以了!它提取已提交的更改并更新已签出的主分支,无需提问。为什么git push
不能自己做这个?
所以这是我的问题:是否有一个与ssh
相同的命令 - 进入我的桌面PC并发出pull
?
答案 0 :(得分:2)
您可以将receive.denyCurrentBranch
设置为警告以允许推送到您的台式PC。但是,这很危险。如果桌面PC中有一些提交,这种推送会引起混淆。
以下是receive.denyCurrentBranch
的手册供您参考。
receive.denyCurrentBranch
If set to true or "refuse", receive-pack will deny a ref update to
the currently checked out branch of a non-bare repository. Such a
push is potentially dangerous because it brings the HEAD out of
sync with the index and working tree. If set to "warn", print a
warning of such a push to stderr, but allow the push to proceed. If
set to false or "ignore", allow such pushes with no message.
Defaults to "refuse".
答案 1 :(得分:2)
问题是当你试图推动你同时做两个动作时。 第一个是更新git树,第二个是更新笔记本电脑上的工作目录。所以在推送过程中有一种隐含的“结账”,git拒绝这样做,这是对的。 想象一下如果某人真的在您的台式PC上工作会发生什么。 当您执行SSH时,事情就不同了,您在工作目录中,您负责所做的一切,因此,可以执行您想要的任务,删除文件,“拉动”。所以在某种程度上看似正常,推送不允许你(默认情况下)弄乱远程计算机。
如果要将receive.denyCurrentBranch设置为忽略,则可以推送但仍需要将工作目录与代码的“最新”版本(刚刚推送的那个)“同步”。这意味着你仍然有2个命令在每台计算机上运行一个
如果你真的只想运行一个命令,请使用shell的强大功能并创建一个别名,从桌面计算机执行git pull
alias remote_pull=ssh <desktop> "cd <path>; git pull"