如何推送到一个非空的 Git 存储库?

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

但是,我不能从这个远程存储库中提取,因为我通常位于防火墙之后,或者我没有公共 IP。

我曾经读到过,我应该仅仅推到一个光秃秃的仓库。然后应该如何将更改推送到远程存储库?

62289 次浏览

最佳选择

可能最干净、最不混乱和最安全的进入非空的远程存储库的方法是,将其推到远程中表示笔记本分支的专用分支。

让我们看一下最简单的情况,假设每个回购中只有一个分支: master。当你从你的笔记本电脑推到远程回购,而不是推 master-> master,推 master-> 膝上型电脑-master (或类似的名称)。通过这种方式,推送不会影响远程回购中当前签出的主分支。要在笔记本电脑上完成这项工作,命令非常简单:

git push origin master:laptop-master

这意味着本地主分支将被推送到远程存储库中名为“膝上型计算机主机”的分支。在您的远程回购中,您将有一个名为“膝上型电脑主机”的新分支,然后您可以合并到您的远程主机时,您准备好了。

备选方案

也可以只按 master-> master,但是一般不推荐按到当前检出的非裸回购分支,因为如果你不理解发生了什么,这会让你感到困惑。这是因为推送到一个签出分支不会更新工作树,所以在被推送到的签出分支中检查 git status将显示与最近被推送的内容完全相反的差异。如果在推送完成之前工作树是脏的,那么它会变得特别混乱,这是为什么不推荐这样做的一个重要原因。

如果您想尝试只按 master-> master,那么命令就是:

git push origin

但是当您返回到远程回购时,您很可能希望执行 git reset --hard HEAD以使工作树与被推送的内容同步。因为如果在远程工作树中有任何您想要保留的 没有承诺更改,它将把它们删除。在尝试之前,确保您知道这样做的后果是什么,或者至少先做一个备份!

从 Git 2.3开始,你可以使用“ push-to-loyment”Git push: https://github.com/blog/1957-git-2-3-has-been-released。但是推送到一个单独的分支然后进行合并通常会更好,因为它会进行实际的合并(因此可以像 merge 那样处理未提交的更改)。

我建议在您的服务器上建立一个裸仓库和一个本地工作(非裸)回购。您可以将更改从笔记本电脑推到服务器裸回购,然后从该裸回购拉到服务器工作回购。我之所以这样说,是因为您可能需要在服务器上复制许多完整/不完整的分支。

这样,在向服务器推送更改时,您就不必担心在服务器工作回购中签出的分支的状态。

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

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

你可以这样做:

$git config --bool core.bare true

这可以在裸存储库或中央存储库中完成,这样它就可以接受从非裸存储库推送的任何文件。 如果您在非裸仓库中这样做,那么我们就不能将任何文件从非裸仓库推送到裸仓库。

如果你正在练习 GIT 通过创建中央和非裸回购在 PC 它可能不会显示被推的文件在一些 PC 的,但它已经被推。你可以用跑步来检查。

中央回收站 $git log

除非你推到 GitHub,它会显示那里的文件。