如何更新我的裸仓库?

Let*_*_Be 122 git

我创建了一个裸仓库来发布我的存储库,但我无法弄清楚如何使用主存储库的当前状态更新裸仓库.

Tho*_*mas 75

如果要复制主仓库中的所有对象,请在主仓库中执行此操作:

git push --all <url-of-bare-repo>
Run Code Online (Sandbox Code Playgroud)

或者,在裸仓库中进行取件:

git fetch <url-of-main-repo>
Run Code Online (Sandbox Code Playgroud)

你不能做拉,因为一个拉想要合并HEAD,一个裸的回购没有.

您可以将这些作为遥控器添加,以便将来节省一些打字:

git remote add <whatever-name> <url-of-other-repo>
Run Code Online (Sandbox Code Playgroud)

然后你就可以做到

git push --all <whatever-name>
Run Code Online (Sandbox Code Playgroud)

要么

git fetch <whatever-name>
Run Code Online (Sandbox Code Playgroud)

取决于你所在的回购.如果<whatever-name>origin,你甚至可以完全放弃它.

免责声明:我不是一个git guru.如果我说错了,我想开悟!

更新:阅读评论!

  • 如果您的最远的仓库是像github那样,你没有访问权限,无法运行推送等,你可以在本地裸仓库中执行`git fetch -q origin master:master`.这将从github的主分支中获取新内容并将本地主分支更新到它. (65认同)
  • @Altreus如果你想要所有分支,那么你可以执行 `git fetch origin *:*` (7认同)
  • 当我在裸存储库中执行`git-fetch --all`时,我没有看到我对主仓库所做的更新,但是当使用`git push --all <url-of从主仓库中推送它们时-bare-repo>`我确实在`git log`中看到了更新.据推测,这有一个简单的解释 - 有人可以解释一下吗? (5认同)
  • @Altreus确实`master:master`是将HEAD移动到远程repo的所需要的.在我的情况下,由于一个问题我不能再连接到我们的裸仓库因为git丢失了.直到它得到解决我做一个反向隧道并使用:`git fetch ssh:// localhost:8765/... master:master`获取到中央仓库,它就像一个魅力.谢谢! (3认同)
  • @Thomas - 是的,“没有看到”我的意思是 `git log` 没有在裸仓库中显示这些更新。(`git log --all` 和通过克隆裸仓库创建的工作仓库也不会 - 通过 `git log --all` 或简单地查看应该显示在那里的新文件)。这是一个非常快速的测试,可以亲眼看看。大多数情况下,我只是好奇我错过了什么。 (2认同)

aus*_*ten 66

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

git clone --bare <remote_repo>

然后我尝试使用Thomas的答案更新裸克隆,但它对我不起作用.为了让裸存储库更新(这是我认为Let_Me_Be所要求的),我必须创建一个镜像存储库:

git clone --mirror <remote_repo>
Run Code Online (Sandbox Code Playgroud)

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

git fetch --all
Run Code Online (Sandbox Code Playgroud)

我通过阅读Mirror a Git Repository来了解这个解决方案

  • 要将现有的裸存储库更改为镜像,您需要做的就是在<REPO> .git/config的git配置文件中添加2行.在``[remote"origin"]`部分,添加`fetch = + refs/*:refs/*`和`mirror = true` (19认同)

Col*_*ett 49

除了与重建唯一的解决办法git clone --mirror从格雷戈尔:

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'
Run Code Online (Sandbox Code Playgroud)

那么你可以git fetch,你会看到更新.奇怪的是,在此之前,即使有remote配置,它也没有列出分支git branch -a.


ant*_*tak 42

假设:

$ git clone --bare https://github.com/.../foo.git
Run Code Online (Sandbox Code Playgroud)

获取:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune
Run Code Online (Sandbox Code Playgroud)

注意:--git-dir=foo.git如果您cd首先访问该目录,则不需要.

  • 虽然我不知道何时发生,但如果没有定义`origin`,你总是可以用原始存储库的路径/ url替换`origin`部分.例如`$ git --git-dir = foo.git fetch https://github.com/.../foo.git + refs/heads/*:refs/heads/*` (2认同)

sim*_*nvc 10

经过多次搞乱后,我发现这对我有用.

一旦:

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/*'
Run Code Online (Sandbox Code Playgroud)

每次我想要同步:

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
Run Code Online (Sandbox Code Playgroud)

  • 第三行(`git config remote.origin.fetch'refs/heads/*:refs/heads/*'`)是关键.好的答案,谢谢! (5认同)
  • 正如@peterh所说,`git config remote.origin.fetch'refs / heads / *:refs / heads / *'`是答案。按下此命令后,我可以执行“ git fetch”操作,并且回购与远程的同步。 (2认同)