如何推送到非裸Git存储库?

时间:2009-11-19 16:02:18

标签: git git-push git-non-bare-repository

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

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

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

5 个答案:

答案 0 :(得分:140)

最佳选择

推入非裸机远程存储库的最简洁,最不容易,最安全的方法可能是推送到代表笔记本电脑分支机构的远程专用分支机构。

让我们看看最简单的情况,并假设每个仓库中只有一个分支:master。当您从笔记本电脑推送到远程仓库时,而不是推送主机 - >主人,推主人 - >笔记本电脑主人(或类似的名字)。这样,推送不会影响远程仓库中当前检出的主分支。要从笔记本电脑上执行此操作,命令非常简单:

git push origin master:laptop-master

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

替代选项

也可以推送主人 - >但是,通常不建议推送到非裸机库的当前已检出的分支,因为如果您不了解发生的情况,可能会造成混淆。这是因为推送到签出分支不会更新工作树,因此检查已推出的已签出分支中的git status将显示与最近推送的内容完全相反的差异。如果在推送完成之前工作树是脏的,那将特别令人困惑,这是不推荐这样做的一个重要原因。

如果你想尝试推送主人 - > 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。但是推送到一个单独的分支然后合并通常会更好,因为它会进行实际的合并(因此可以像merge一样使用未提交的更改)。

答案 1 :(得分:107)

<强> receive.denyCurrentBranch updateInstead

This options已添加in 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

答案 2 :(得分:15)

我建议你的服务器中有一个裸存储库和一个本地工作(非裸)存储库。您可以将更改从笔记本电脑推送到服务器裸仓库,然后从该裸仓库转移到服务器工作仓库。我说这个的原因是因为你可能在服务器上有许多完整/不完整的分支,你想要在笔记本电脑上复制。

这样,您无需担心在将更改推送到服务器时检出服务器工作存储库上的分支状态。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

你可以这样做:

$git config --bool core.bare true

这可以在裸存储库或中央存储库中完成,以便它可以接受从非裸存储库推送的任何文件。 如果你在非裸存储库中执行此操作,那么我们就无法将任何文件从非裸存储库推送到裸存储库。

如果您通过在PC中创建中央和非裸仓库来练习GIT,它可能不会在某些PC中显示推送的文件,但它已被推送。你可以通过跑步来检查它。

中央回购中的

$git log

除了你推送到GitHub之外,它会在那里显示文件。