我通常通过ssh(屏幕和vim)在远程服务器上工作,那里有一个Git存储库。有时我不在线,所以我在笔记本电脑上有一个单独的存储库(从远程克隆)。
但是,由于我通常位于防火墙后面或没有公共IP,因此无法从远程存储库中提取信息。
我读过我应该只推送到裸仓库。然后,我应该如何将更改推送到远程存储库?
git pull github master
。
我通常通过ssh(屏幕和vim)在远程服务器上工作,那里有一个Git存储库。有时我不在线,所以我在笔记本电脑上有一个单独的存储库(从远程克隆)。
但是,由于我通常位于防火墙后面或没有公共IP,因此无法从远程存储库中提取信息。
我读过我应该只推送到裸仓库。然后,我应该如何将更改推送到远程存储库?
git pull github master
。
Answers:
receive.denyCurrentBranch updateInstead
此选项已在Git 2.3中添加,如果干净,它可使服务器更新其工作树。
因此,如果确保在本地拉动之前始终执行提交操作,并在服务器上保持干净的工作树(应该这样做以避免合并冲突),那么此选项是一个很好的解决方案。
用法示例:
git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead
cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master
cd ../server
ls
输出:
a
b
--local
可选的吗?
--local
仅影响当前目录,并--global
影响所有git repos ~/.gitconfig
,请参见man git-config
。
最佳选择
推入非裸露的远程存储库的最干净,最少混乱和最安全的方法可能是推入代表笔记本电脑分支的远程专用分支。
让我们看一下最简单的情况,并假设每个回购中只有一个分支:master。当您从笔记本电脑推送到远程存储库时,而不是推送master-> master,而是推送master-> laptop-master(或类似名称)。这样,推送不会影响远程仓库中当前已签出的master分支。要从笔记本电脑执行此操作,该命令非常简单:
git push origin master:laptop-master
这意味着本地master分支将被推送到远程存储库中名为“ laptop-master”的分支。在您的远程仓库中,您将有一个名为“ laptop-master”的新分支,您可以在准备好之后将其合并到远程主机中。
替代选择
也可以只推送master-> master,但是一般不建议推送到非裸仓库的当前已签出分支,因为如果您不了解正在发生的事情可能会造成混淆。这是因为推送到签出的分支不会更新工作树,因此签git status
入被推送到签出的分支将显示与最近推送的完全相反的差异。如果在完成推送之前工作树脏了,那将特别令人困惑,这是不建议这样做的重要原因。
如果要尝试仅按master-> master,则命令为:
git push origin
但是,当您返回到远程仓库时,您很可能想要做一个git reset --hard HEAD
使工作树与推送内容同步的工作。这可能很危险,因为如果要保留的远程工作树中有任何未提交的更改,则会将其清除。在尝试之前,请确保您知道这样做的后果,或者至少首先进行备份!
编辑从Git 2.3开始,您可以使用“ push-to-deploy” git push:https : //github.com/blog/1957-git-2-3-has-been-released。但是推送到一个单独的分支然后合并通常会更好,因为它可以进行实际的合并(因此,与合并一样,未提交的更改也可以工作)。
git config receive.denyCurrentBranch ignore
必须在推入非裸
git push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
另一个选择是设置反向ssh隧道,以便可以拉动而不是推动。
# start the tunnel from the natted box you wish to pull from (local)
$ ssh -R 1234:localhost:22 user@remote
# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side
如果您希望隧道在后台运行
$ ssh -fNnR 1234:localhost:22 user@remote