Wie verfolgt git Änderungen, warum wird es verwirrt? Weil ich es tue

1427
towi

Ich habe ein Git-Repository in einem Dropbox-Ordner, der von einer Linux-Maschine und einer Windows-Maschine gemeinsam genutzt wird. Ich versuche nur auf dem Windows-Computer zu synchronisieren, da mir "mögliche Probleme" bekannt sind. Gelegentlich mache ich ein kleines Commit für die Linux-Box, um meine Änderungen zu verfolgen,

Aber jetzt bin ich wirklich neugierig, was git macht: Ich habe die Datei nicht berührt fonttest.tex, aber git meldet mir, dass sie geändert wurde:

towi@havaloc:~/Dropbox/latex$ git status fonttest.tex # On branch master ... # modified: fonttest.tex 

Und das difflistet die ganze Datei auf: Alle Zeilen gelöscht und wieder eingefügt. Ok, wahrscheinlich eine CRLF-Ausgabe. Also frage ich todosund fromdosmit und ohne CR und CRLF hin und her konvertieren. Aber - Sie ahnen schon - keine Änderung für git: Alle Zeilen haben sich geändert.

Hmm, dachte ich, da ich weiß, dass sich nichts geändert hat, bekomme ich eine Kopie davon :

mv fonttest.tex fonttest.tex1 git checkout fonttest.tex 

Und weil ich eine neugierige Person bin, möchte ich den Unterschied sehen:

diff fonttest.tex fonttest.tex1 

nichts. "Ja wirklich?"

towi@havaloc:~/Dropbox/latex$ md5sum fonttest.tex* d3544bd060504ebb682b2e446375b3b3 fonttest.tex d3544bd060504ebb682b2e446375b3b3 fonttest.tex1 

Ja wirklich. Und was denkt Git darüber ?

towi@havaloc:~/Dropbox/latex$ git status fonttest.tex # On branch master ... # modified: fonttest.tex 

Mann, du hast es gerade für mich geprüft! Was ist hier los? Warum denkt git, dass sich die Datei geändert hat?

Hier ist ein Auszug meiner Konfig. Ich habe einige Anpassungen in Bezug auf CRLF vorgenommen, indem ich einige Tipps für das Dropbox-Sharing befolgt habe. Aber ... ich kann hier nicht einfach nur git folgen.

towi@havaloc:~/Dropbox/latex$ git config -l  diff.renames=copies apply.ignorewhitespace=change apply.whitespace=nowarn core.whitespace=cr-at-eol core.repositoryformatversion=0 core.filemode=false core.logallrefupdates=true core.symlinks=false core.ignorecase=true core.eol=lf core.autocrlf=input 
4

2 Antworten auf die Frage

1
Stephen Jennings

Obwohl es wahrscheinlich in Ordnung ist, ein Git-Repository in einem Dropbox-Ordner zu speichern, besteht das Problem darin, dass mehrere Systeme ein Arbeitsverzeichnis und einen Index gemeinsam nutzen, wenn Sie sie dort behalten. Git wurde nicht wirklich für diese Art von Verwendung entwickelt.

Ich vermute, dass das Problem, auf das Sie stoßen, etwas damit zu tun hat. Möglicherweise handelt es sich um ein Zeilenende-Problem, da Ihr Windows-Computer verwendet wird \r\n, Ihr Linux-Computer jedoch \n.

Wenn Sie Dropbox verwenden möchten, um Git-Repositorys synchron zu halten, würde ich empfehlen, ein nacktes Repository in Dropbox zu belassen, und dann aus separaten Repositorys abzurufen. Auf diese Weise wird das Bare-Repository über Dropbox synchronisiert, doch jedes Betriebssystem hält seine eigenen Arbeitsverzeichnisse und Indizes separat.

Sie würden dies auf Ihrem Linux-Rechner tun:

mv ~/Dropbox/latex ~/ cd ~/latex git init --bare ~/Dropbox/latex.git git remote add dropbox ~/Dropbox/latex.git git push dropbox master 

Führen Sie dann auf Ihrem Windows-Computer Folgendes aus:

cd %USERPROFILE% git clone Dropbox\latex.git cd latex git remote rename origin dropbox 

Ab diesem Zeitpunkt erledigen Sie Ihre gesamte Arbeit in ~/latex(Linux) und %USERPROFILE%\latex(Windows). Wenn Sie Commits machen, die Sie teilen möchten, würden Sie sie git push dropbox masterin einem Repo und git pull dropbox masterin dem anderen verwenden.

Gute Idee. Daran habe ich nicht gedacht. Auf diese Weise konnte ich auch die erforderlichen unterschiedlichen Pfade in beiden Betriebssystemen behandeln. towi vor 11 Jahren 0
0
Ciclamino

Sie schnappen einige möglicherweise wichtige Informationen aus der Git-Statusausgabe. Sagt git status "Änderungen, die nicht für das Festschreiben bereitgestellt werden" oder "Änderungen, die festgeschrieben werden sollen". Wenn letzteres besagt, wird die Datei immer als geändert angezeigt, weil Sie Änderungen am Index vorgenommen haben.

* nicht inszeniert *. Ich kann die "git" Datei hinzufügen und es erscheint als * inszeniert für commit * towi vor 12 Jahren 0