首先,大局:我正在尝试为我正在运行的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
从上一个示例中可以看出,裸存储库无法更新,并且两个文件之间存在某种差异。我做错了什么?
提前致谢
答案 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
以将分支与遥控器同步 请注意,这只适用于不应编辑本地分支的裸存储库。