Git clone --bare/fetch

У меня есть репозиторий git с длинной и странной историей. Я не знаю, что разработчики сделали с этим репозиторием и не могут контролировать, что они делают с ним сейчас.

Но мне нужно клонировать этот репозиторий (для интеграции redmine) и периодически получать все изменения.

Что мне делать:

git clone --bare [email protected]:/opt/git/repo
cd repo.git
git log

Теперь я вижу все фиксации. Хорошо.

Затем разработчик совершит фиксацию в основном репозитории, и я хочу получить все изменения (все брансы, теги и т.д. и т.д.):

> git fetch --all 
Fetching origin
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 14 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (14/14), done.
From git.gmcs.ru:/opt/git/ecco
 * branch            HEAD       -> FETCH_HEAD

Но если спросить историю фиксации, я не вижу последнего коммита, который был сделан в основном репозитории. Почему?

Если я опубликую недостаточно информации, я готов предоставить вам все необходимое.

Спасибо заранее.

Обновление

Вот информация о плечах в исходном репозитории:

git branch -a
  one
  test
* master
  release

Вот информация о ветке в клонированном репозитории:

git branch -a
  one
  test
* master
  release

Я вижу последние коммиты в основной ветке исходного репозитория, но не могу найти их в главной ветки клонированного репозитория.

Ответ 1

Вы должны использовать git pull

или запустите git merge после извлечения, чтобы получить внесенные изменения

если у вас есть голый репозиторий, вы не можете сделать притяжение, потому что тяга хочет слиться с HEAD, у которой нет репо.

чтобы обновить голый репозиторий, вы можете добавить его как remote в не-голый репозиторий и нажать на него.

Но я думаю, что --mirror вместо --bare будет работать для вас как есть.

По сравнению с --bare, --mirror не только отображает локальные ветки источник в локальные ветки цели, он отображает все ссылки (включая удаленные ветки, заметки и т.д.) и устанавливает конфигурацию refspec, такую ​​как что все эти ссылки перезаписываются удаленным обновлением git в целевого хранилища.

а затем вы можете использовать git remote update для обновления зеркального репозитория

Ответ 2

Чтобы получить больше обновлений в голое репо, я:

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

Тогда я могу сделать:

git fetch

Ответ 3

Вы можете обновить HEAD вашего голого репозитория с помощью git symbolic-ref, например. направить его на ветвь master с удаленного origin

$ git symbolic-ref HEAD refs/remotes/origin/master

Если вы используете git fetch для обновления пультов, он будет обновляться, например. origin/master. Все, чего не хватало, - это перевести клон HEAD.

Ответ 4

Чтобы войти в свой обычный репозиторий, сначала настройте

git config remote.origin.fetch "+*:*"

а затем просто запустите

git fetch --prune

для извлечения всех изменений, включая теги, новые ветки и даже исключения ветвей (опция --prune).

  • Также обратите внимание на заключенные двойные кавычки (") в приведенной выше команде, чтобы защитить астерикс (*), чтобы не интерпретироваться из вашей оболочки.
  • Значок "плюс" необходим для обеспечения немедленного обновления. Возможно, это ваше намерение, если вы хотите сделать резервную копию текущего состояния вашего пульта.
  • Примечание. Удаление тегов не выполняется с помощью этой конфигурации.

См. также fooobar.com/info/30673/....