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/....