Git Fetch无法在裸仓库上运行,但git pull适用于普通仓库

时间:2012-05-22 06:20:32

标签: git

首先,大局:我正在尝试为我正在运行的Redmine / Gitolite服务器编写一个git post-receive脚本。根据各种建议,我正在为Redmine创建一个裸的本地存储库来读取,我正在Gitolite上设置一个接收后脚本,以便将更改推送到Redmine存储库中。

然而,我对Git非常苛刻,所以我甚至无法在这里完成一项简单的任务> _<。我想如果我弄清楚这一点,我应该能够编写上面的脚本。在设置我的测试回购后,我创建了两个回购作为测试。

(“Central Repo”是git @ localhost:测试中的Gitolite存储库)

cd /tmp
mkdir /tmp/test
$ git clone git@localhost:testing
$ git clone git@localhost:testing testing2
$ git clone git@localhost:testing --bare

现在我跑ls:

$ ls
testing  testing2  testing.git

现在,我更改了测试2中的测试文件,然后将更改推送到中央存储库。

$ cd testing2
$ echo 'testline' >> test && git commit --allow-empty-message -a -m '' && git push 

正如所料,如果我在“testing”文件夹上运行“git pull”,一切都按预期工作。

$ cd testing
$ git pull
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From localhost:testing
   3242dba..a1ca5ba  master     -> origin/master
Updating 3242dba..a1ca5ba
Fast-forward
 test |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
$ diff ./test ../testing2/test
$

如上一个“diff”所示,“testing”目录和“testing2”目录完全按预期工作。 “git pull”命令同步两个目录。

但是,如果我进入testing.git(又名:裸仓库),git fetch / git reset --soft无法将裸仓库更新到最新版本。

$ ls
branches  config  description  HEAD  hooks  info  objects  packed-refs  refs
$ git fetch
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From localhost:testing
 * branch            HEAD       -> FETCH_HEAD
$ git reset --soft
$ cd ..
$ git clone ./testing.git testing3
Cloning into testing3...
done.
$ cd testing3
$ diff test ../testing2/test
5a6
> testline

从上一个示例中可以看出,裸存储库无法更新,并且两个文件之间存在某种差异。我做错了什么?

提前致谢

1 个答案:

答案 0 :(得分:26)

您的提取尚未更新master分支,仅更新FETCH_HEAD(请参阅“What does FETCH_HEAD in Git mean?”)。

如“how do I pull to a bare repository?”中所述,您应该执行以下操作:

git fetch origin master:master

或者,对于all the branches

git fetch origin +refs/heads/*:refs/heads/*

Colin D Bennett补充道:

  

如果您想定期获取这些内容,您应该考虑:

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

允许您输入git fetch以将分支与遥控器同步   请注意,这只适用于不应编辑本地分支的裸存储库