2012-11-19 2 views
6

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

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

Что делать:

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

Теперь я могу видеть все коммиты. Хорошо.

Далее разработчик сделать коммит в главном хранилище, и я хочу, чтобы извлечь все изменения (все brances, теги и так далее, и так далее):

> 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 

Но если спросить фиксации истории I не видел последнего коммита, который был сделан в основном репозитории. Зачем ?

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

Заранее спасибо.

Обновлено

Вот информация Brach в оригинальном repsitory:

git branch -a 
    one 
    test 
* master 
    release 

Вот информация филиал в клонированной хранилище:

git branch -a 
    one 
    test 
* master 
    release 

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

+0

'fatal:/usr/lib/git/git-pull' не может использоваться без рабочего дерева. Я думаю, это потому, что это голый репозиторий. – demas

ответ

7

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

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

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

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

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

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

, а затем вы можете использовать git remote update обновить Зеркальный репозиторий

+1

'fatal:/usr/lib/git/git-pull' не может использоваться без рабочего дерева. Я думаю, это потому, что это голый репозиторий. – demas

+0

Извините, может быть, вам нужно иметь открытый репозиторий? – Cynede

+0

Да, как я вижу, Redmine требует голого репозитория. Более того, этот метод отлично работает со всеми другими репозиториями, бит, я не могу понять, что не так с этим репо. – demas

0

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

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

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

+0

Я пробовал, но получил: 'git log' ->' fatal: bad default revision 'HEAD''. – demas

9

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

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

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

git fetch 
+2

Это лучший ответ. Все остальные ответы на вопрос об извлечении * в * репо, созданный 'git clone --bare', не исправляют его для меня. Решение symbolic-ref не является большим, потому что это необходимо для каждой ветви каждый раз, не желательно. –

+1

Если вы используете 'git fetch -p', он дополнительно обрезает ветви, которые были удалены из источника. – cdyson37

0

Чтобы принести в открытое хранилище регулярно настроить первый

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

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

git fetch --prune 

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

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

См. Также https://stackoverflow.com/a/33461528/4138912.