2015-07-25 2 views
5

Я хочу синхронизировать каталог, содержащий git repo моих dotfiles на двух машинах. Обе машины внесут изменения в файлы в репо. Обычно я использую унисон для синхронизации каталогов, но в этом случае файлы в каталоге .git расходятся, даже если содержимое каталога якобы одинаково. Унинон поднимает руки и уходит, когда видит это.Синхронизирующие каталоги, содержащие репозиторий git с unison

$ unison dotfiles 
changed <-?-> changed .git/FETCH_HEAD 
changed <-?-> changed .git/ORIG_HEAD 
changed <-?-> changed .git/index 
changed <-?-> changed .git/logs/HEAD 
changed <-?-> changed .git/logs/refs/heads/master 
changed <-?-> changed .git/logs/refs/remotes/origin/master 

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

Я не хочу делать какие-либо git-коммиты как часть синхронизации. Я вижу контроль версий и синхронизацию как два отдельных вопроса.

Ввод слов git и sync в google дает результаты, описывающие клонирование репо. Чтобы быть ясным, ни одно из применений «sync» выше не относится к git-действиям.

ответ

2

Байт по-байтовой синхронизации здесь не работает, потому что даже с теми же файлами и git, внутренние файлы git могут быть разными.

Вот почему вы не синхронизировать .git папку (other have tried with dropbox, the result was not satisfactory)

Я бы рекомендовал using git bundle, но этот процесс может быть немного запутанным.

Существуют и другие инструменты для управления и синхронизации точечных файлов. Один очень хороший - RichiH/vcsh, представленный в GitMinutes #13, и в этом blog post.

+0

Вы говорите, что все это не работает для живой синхронизации? – Praxeolitic

+0

@Praxeolitic не с git repo в любом случае. Git - это не значит, что вы живете sync'd, но его использовали для управления dotfiles. – VonC

+1

Я должен был прояснить это изначально, но в реальном времени синхронизировать git-репо и все состояния git через машины по сути невозможны на данный момент?Под этим я имею в виду, что-то о git делает эту задачу самой нечувствительной или удовлетворительных решений просто не существует? Благодарю. – Praxeolitic

4

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

Соответствующая часть моей .unison/dotfiles.prf:

root = /home/khouli/dotfiles 
root = ssh://other_machine//home/khouli/dotfiles 
ignore = BelowPath .git 

Соответствующая часть моей синхронизации сценария:

unison dotfiles 
(cd $HOME/dotfiles && git fetch) 
ssh other_machine 'cd dotfiles && git fetch' 

Это синхронизирует сами и истории фиксируете файлы. Он не синхронизируется, но это не слишком важно, и это может быть даже нежелательно. Это также требует, чтобы обе машины имели соответствующее сетевое соединение для git fetch. В противном случае можно использовать git bundle, например, предложения VonC.

Это просто здесь, если кто-либо приходит сюда из Google и считает его полезным. Я не отмечаю его как принятое, потому что было бы интересно, если бы ответ появился, чтобы жить синхронизировать git-репо.

Смежные вопросы