如何更新我的裸仓库?


Answers:


83

如果要复制主存储库中的所有对象,请在主存储库中执行以下操作:

git push --all <url-of-bare-repo>

或者,在裸仓库内进行访存:

git fetch <url-of-main-repo>

您不能进行拉取,因为拉取要与合并HEAD,而裸仓库没有。

您可以将它们添加为遥控器,以节省以后的输入内容:

git remote add <whatever-name> <url-of-other-repo>

那你就可以做

git push --all <whatever-name>

要么

git fetch <whatever-name>

根据您所在的存储库而定。如果<whatever-name>origin,则甚至可以完全忽略它。

免责声明:我不是git guru。如果我说错了,我想得到启发!

更新:阅读评论!


7
当我git-fetch --all在裸仓库中进行内部操作时,没有看到对主存储库所做的更新,但是当从主存储库中推送它们时,git push --all <url-of-bare-repo>确实看到了中的更新git log。大概有一个简单的解释-有人可以解释吗?
pho79 2012年

2
@Thomas-是的,“没看到”我的意思git log是不会在裸仓库中显示这些更新。(也不会git log --all,通过克隆裸仓库创建的工作仓库也不会-通过git log --all或只是查看应该显示在此处的新文件)。亲自观察这是一个非常快速的测试。通常,我只是好奇我所缺少的。
pho79 2012年

70
如果您最远程的存储库是github之类的东西,则您无权访问,无法运行push等,则可以git fetch -q origin master:master在本地裸存储库中进行操作。这将从github的master分支中获取新内容,并将您的本地master分支更新到该分支。
Altreus 2012年

4
@Altreus确实master:master是将HEAD移至远程仓库的必要条件。就我而言,由于一个问题,由于git丢失,我无法再连接到裸仓库。直到它得到解决我做了反向隧道,并使用取到中央回购:git fetch ssh://localhost:8765/... master:master和它的作品就像一个魅力。谢谢!
estani

2
@Altreus如果您想要所有分支机构,那么您可以做git fetch origin *:*
JBert

71

我使用以下命令创建了一个存储库

git clone --bare <remote_repo>

然后,我尝试使用托马斯的答案来更新裸机克隆,但这对我不起作用。为了获取裸仓库进行更新(这就是我认为Let_Me_Be提出的问题),我必须创建一个镜像仓库:

git clone --mirror <remote_repo>

然后,我可以在镜像存储库中运行以下命令以获取主存储库的更新:

git fetch --all

我通过阅读通过镜像镜像Git存储库遇到了这个解决方案


22
要将现有的裸仓库更改为镜像,只需在<REPO> .git / config的git config文件中添加两行即可。在该[remote "origin"]部分中,添加fetch = +refs/*:refs/*mirror = true
Isaac Betesh 2013年

@IsaacBetesh您保存了我的一天:)
smc

54

除了重新创建之外,唯一的解决方案git clone --mirror来自Gregor

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

然后您就可以git fetch看到更新。奇怪的是,在此之前,即使已remote配置,它也没有列出分支git branch -a


1
这真的帮助了我!Capistrano项目/存储库也使用此设置来允许单行git remote update执行此工作。
潘敏琦2014年

1
如果遥控器具有强制更新或删除的分支(并且您想反映这些更改),则可能需要分别向该行添加--force和。--prunegit fetch
Elliott Slaughter 2015年

46

假设:

$ git clone --bare https://github.com/.../foo.git

取得:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

注意:--git-dir=foo.git如果您cd先进入目录,则不需要。


2
尽管我不知道何时发生,但如果origin未定义,则始终可以origin用原始存储库的路径/ URL 替换该部分。例如$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak

这正是我想要的。这工作得很好。
Maxime Rouiller

13

经过一番混乱后,我发现这对我有用。

一旦:

git clone --mirror ssh://git@source.address:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

每当我想同步时:

cd /home/myhome/repo.git
git --bare fetch ssh://git@source.address:2000/repo
git  fetch ssh://git@source.address:2000/repo
git push --mirror remote_site

7
第三行(git config remote.origin.fetch 'refs/heads/*:refs/heads/*')是关键。好答案,谢谢!
彼得-恢复莫妮卡

2
正如@peterh所说,这git config remote.origin.fetch 'refs/heads/*:refs/heads/*'是答案。按下此命令后,我可以git fetch将仓库与远程仓库同步。
小丑

3

将裸存储库添加为远程存储库,然后使用git push


因此,如果我想在不推动的情况下执行此操作,就无法使用裸存储库并使用符号链接或类似的东西?
西蒙·托特

推送是将存储库内容传输到裸存储库的常规方法,无需避免这种情况。
菲利普

2
您不能总是推动。例如,如果裸机在专用网络中,而主存储库是公共存储库(例如,在GitHub上)
fanf42 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.