推送到非纯粹的Git存储库

我通常通过ssh(screen和vim)在远程服务器上工作,在那里我有一个Git仓库。 有时我不在线,所以我在我的笔记本电脑上有一个单独的存储库(从我的远程克隆)。

但是,我无法从远程端的这个存储库中获取,因为我通常在防火墙后面,或者我没有公共IP。

我读过,我应该推到一个裸仓库。 我应该如何将更改推送到远程存储库?

receive.denyCurrentBranch updateInstead , 在Git 2.3中添加,如果干净,也更新服务器的工作树。

所以,如果你确保在你本地提取之前总是提交,并在服务器上保留一个干净的工作树(为了避免合并冲突,你应该这样做),那么这个选项是一个很好的解决scheme。

示例用法:

 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 

最好的select

可能是最简单,最容易混淆,最安全的方式推入非裸露的远程存储库,是推到代表您的笔记本电脑分支的远程专用分支机构。

让我们看看最简单的情况,假设你在每个回购中只有一个分支:master。 当你从你的笔记本电脑推到远程回购,而不是推主 – >主,推主 – >笔记本 – 主(或类似的名字)。 这样推送不会影响远程回购中的当前签出的主分支。 要做到这一点从笔记本电脑,这个命令是非常简单的:

 git push origin master:laptop-master 

这意味着本地主分支将被推送到远程仓库中名为“laptop-master”的分支。 在远程仓库中,您将拥有一个名为“laptop-master”的新分支,您可以在准备就绪后将其合并到远程主分区中。

备用选项

也可以推master – > master,但推荐到非裸回购的当前check-out分支通常是不被推荐的,因为如果你不明白是怎么回事,可能会引起混淆。 这是因为推送到检出分支不会更新工作树,所以在检入的分支中检查git status会显示与最近推送的相反的区别。 如果工作树在推送完成之前变脏,会变得特别混乱,这是不推荐的一个重要原因。

如果你想尝试推动主 – >主,那么命令只是:

 git push origin 

但是当你回到远程仓库时,你很可能会想要做一个git reset --hard HEAD来让工作树与被推送的内容同步。 这可能是危险的 ,因为如果远程工作树中有任何未提交的更改,您想保留它将会将其清除。 在尝试之前一定要知道这个结果是什么,或者至less先做一个备份!

编辑自从Git 2.3,你可以使用“推 – 部署”git推: https : //github.com/blog/1957-git-2-3-has-been-released 。 但推送到一个单独的分支,然后合并通常是更好的,因为它实际上合并(因此像合并一样工作与未提交的更改)。

我build议在你的服务器上有一个裸仓库和一个本地工作(非裸)的仓库。 你可以推动从笔记本电脑到服务器裸露的回购变化,然后从裸露的回购拉动服务器工作回购。 我之所以这样说,是因为你可能在服务器上有很多完整/不完整的分支,你需要在笔记本上进行复制。

这样,您不必担心在将服务器更改推送到服务器时检查了分支的状态。

另一个select是设置一个反向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