wok*_*oky 139 git git-push git-non-bare-repository
我通常通过ssh(screen和vim)在远程服务器上工作,我有一个Git存储库.有时我不上网,所以我的笔记本电脑上有一个单独的存储库(从我的遥控器克隆).
但是,我无法从远程端的这个存储库中取出,因为我通常在防火墙后面,或者我没有公共IP.
我已经读过,我应该只是推到一个裸存储库.我应该如何将更改推送到远程存储库?
Dan*_*ing 144
最佳选择
推入非裸机远程存储库的最简洁,最不容易,最安全的方法可能是推送到代表笔记本电脑分支机构的远程专用分支机构.
让我们看一下最简单的情况,并假设每个仓库中只有一个分支:master.当您从笔记本电脑推送到远程仓库时,而不是推送主 - >主,推主 - >笔记本主 - (或类似的名称).这样,推送不会影响远程仓库中当前检出的主分支.要从笔记本电脑执行此操作,命令非常简单:
git push origin master:laptop-master
Run Code Online (Sandbox Code Playgroud)
这意味着本地主分支将被推送到远程存储库中名为"laptop-master"的分支.在您的远程仓库中,您将拥有一个名为"laptop-master"的新分支,然后您可以在准备好时将其合并到远程主服务器中.
替代选项
也可以只推送master - > master,但通常不建议推送到非裸仓库的当前签出分支,因为如果你不明白发生了什么,可能会让人感到困惑.这是因为推送到签出分支不会更新工作树,因此检git status入已推出的签出分支将显示与最近推送的完全相反的差异.如果在推送完成之前工作树是脏的,那将特别令人困惑,这是不建议这样做的一个重要原因.
如果你想尝试只推送master - > master,那么命令只是:
git push origin
Run Code Online (Sandbox Code Playgroud)
但是当你回到远程仓库时,你很可能想要做一个git reset --hard HEAD让工作树与推送的内容同步.这可能很危险,因为如果远程工作树中有任何未提交的更改要保留,则会将其擦除.在尝试之前,请确保知道这样做的后果,或者至少先备份!
编辑自Git 2.3以来,您可以使用"push-to-deploy"git push:https://github.com/blog/1957-git-2-3-has-been-released.但是推送到一个单独的分支然后合并通常会更好,因为它会进行实际的合并(因此可以像merge一样使用未提交的更改).
Cir*_*四事件 121
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
Run Code Online (Sandbox Code Playgroud)
输出:
a
b
Run Code Online (Sandbox Code Playgroud)
Man*_*ish 16
我建议你的服务器上有一个裸存储库和一个本地工作(非裸)存储库.您可以将更改从笔记本电脑推送到服务器裸仓库,然后从该裸仓库转移到服务器工作仓库.我说这个的原因是因为你可能在服务器上有许多完整/不完整的分支,你想要在笔记本电脑上复制.
这样,您无需担心在将更改推送到服务器时检出服务器工作存储库上的分支状态.
另一种选择是设置反向 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
Run Code Online (Sandbox Code Playgroud)
如果你想让隧道在后台运行
$ ssh -fNnR 1234:localhost:22 user@remote
Run Code Online (Sandbox Code Playgroud)