Git Fetch не работает на голое репо, но git работает по нормальному репо

Во-первых, большая картина: я пытаюсь написать git post-receive script для сервера Redmine/Gitolite, на котором я запущен. В соответствии с различными рекомендациями я создаю голый и локальный репозиторий для Redmine для чтения, и я настраиваю post-receive script на Gitolite, чтобы вносить изменения в репозиторий Redmine.

Тем не менее, я очень noobish с Git, поэтому я не могу даже выполнить простую задачу здесь > _ <. Я думаю, что если я это выясню, я смогу написать выше script. После настройки моего тестового репо я создал два репозитория в качестве теста.

( "Центральный репо" - это хранилище Gitolite на git @localhost: testing)

cd /tmp
mkdir /tmp/test
$ git clone [email protected]:testing
$ git clone [email protected]:testing testing2
$ git clone [email protected]:testing --bare

Теперь, когда я запустил ls:

$ ls
testing  testing2  testing.git

Теперь я меняю тестовый файл внутри test2, а затем нажимаю изменения на центральное репо.

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

Как и ожидалось, если я запустил "git pull" в папке "test", все будет работать так, как ожидалось.

$ 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" и каталог "test2" работают точно так, как ожидалось. Команда git pull "синхронизирует два каталога.

Однако, если я cd в test.git(aka: голый репо), 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

Ваша выборка не обновила ветвь master, только FETCH_HEAD (см. "Что означает FETCH_HEAD в Git означает?" ).

Как указано в "как я могу потянуть в голый репозиторий?, вы должны сделать:

git fetch origin master:master

Или, для всех ветвей:

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

Колин Д Беннетт добавил:

Если вы хотите получать их на регулярной основе, вы должны подумать:

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

который позволит вам набрать git fetch, чтобы синхронизировать ветки с пультом дистанционного управления.
Обратите внимание, что это имеет смысл только в открытом репозитории, где локальные ветки не должны редактироваться.