2015-07-25 8 views
5

Ich möchte ein Verzeichnis mit einem Git-Repo meiner Datendateien auf zwei Rechnern synchronisieren. Beide Maschinen nehmen Änderungen an den Dateien im Repo vor. Normalerweise verwende ich Unison zum Synchronisieren von Verzeichnissen, aber in diesem Fall divergieren die Dateien im Verzeichnis .git sogar dann, wenn der Inhalt des Verzeichnisses scheinbar identisch ist. Unison wirft seine Hände auf und hört auf, wenn er das sieht. kann unterschiedlich seinSynchronisieren von Verzeichnissen, die das Git-Repository mit Unison enthalten

$ 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 

Ein Byte-für-Byte-Sync hier nicht, weil auch Dateien mit den gleichen Dateien und git Zustand der internen git funktioniert. Wie kann ich diese Verzeichnisse synchronisieren? Nach der Synchronisierung sollten alle Nicht-Git-Dateien und der Git-Status auf beiden Rechnern identisch sein. Mit git state meine ich commit histories und staging, aber nicht unbedingt jedes Byte jeder internen git Datei (z. B. .gitigore, .git). Ich weiß nicht genug über git, um näher darauf einzugehen, was ich damit meine, aber wenn das unklar ist, kommentiere es einfach.

Ich möchte keine Git-Commits als Teil der Synchronisierung machen. Ich sehe Versionskontrolle und Synchronisierung als zwei separate Probleme hier.

Wenn Sie die Wörter git und sync in Google einfügen, erhalten Sie Ergebnisse, die beschreiben, wie ein Repo geklont wird. Nur um klar zu sein, keiner der oben genannten Verwendungen von "sync" bezieht sich auf Git-Aktionen.

Antwort

2

Eine Byte-für-Byte-Synchronisierung funktioniert hier nicht, da die internen Git-Dateien auch bei den gleichen Dateien und git-Zuständen unterschiedlich sein können.

Deshalb Sie keinen .git Ordner (other have tried with dropbox, the result was not satisfactory)

synchronisieren würde ich using git bundle empfehlen, aber der Prozess kann ein wenig gewunden sein.

Es gibt andere Tools zum Verwalten und Synchronisieren von Datendateien. Eine sehr gute ist RichiH/vcsh, dargestellt in GitMinutes #13 und in dieser blog post.

+0

Sie sagen, die ganze Sache ist ein No-Go für Live-Sync? – Praxeolitic

+0

@Praxeolitic nicht mit Git Repo sowieso. Git soll nicht live synchronisiert werden, sondern wurde zu verwalteten Datendateien verwendet. – VonC

+1

Ich sollte dies ursprünglich geklärt haben, aber ist Live-Synchronisierung ein Git Repo und alle git Zustand über Maschinen von Natur aus unmöglich jetzt?Damit meine ich, dass etwas an Git diese Aufgabe unsensibel macht oder befriedigende Lösungen einfach nicht existieren? Vielen Dank. – Praxeolitic

4

Basierend auf VonC's Beratung, werde ich die Anforderung der Live-Synchronisierung des gesamten Git-Status zu entspannen und ignorieren Sie einfach die .git-Verzeichnis mit Unison und einfach git fetch verwenden.

Relevante Teil meines .unison/dotfiles.prf:

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

Relevante Teil meines Sync-Skript:

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

Diese synchronisiert die Dateien selbst und die Geschichte begehen. Das Staging wird nicht synchronisiert, aber das ist nicht so wichtig und möglicherweise nicht wünschenswert. Dies erfordert auch, dass beide Maschinen eine geeignete Netzwerkverbindung für eine git fetch haben. Ansonsten könnte git bundle wie vonC vorgeschlagen werden.

Dies ist nur hier, wenn jemand kommt hier von Google und findet es nützlich. Ich werde es nicht als akzeptiert markieren, weil es interessant wäre, wenn eine Antwort mit einer Möglichkeit zur Live-Synchronisierung eines Git Repo angezeigt würde.

Verwandte Themen