Ich möchte die Konfigurationsdateien direkt ändern (wie .gitignore und .git / config), anstatt mich an beliebige Befehle zu erinnern, aber ich weiß nicht, wo Git die Dateireferenzen speichert, die an "git update-index --assume" übergeben werden -unveränderte Datei ".
Wenn Sie es wissen, sagen Sie es bitte!
Es heißt wo im Befehl - git update-index
Sie können also den Index nicht wirklich bearbeiten, da es keine Textdatei ist.
Weitere Informationen darüber, was mit dem Befehl git update-index --assume-unchanged
gespeichert wird, finden Sie unter Using “assume unchanged” bit
Abschnitt im Handbuch
Wie andere bereits sagten, wird es im Index gespeichert, der sich in .git/index
befindet.
Nach ein paar Detektivarbeiten fand ich heraus, dass es sich um Folgendes dreht: nehme gültiges Bit jedes Indexeintrags an.
Bevor Sie also das Folgende verstehen, sollten Sie zunächst das globale Format des Index verstehen, wie in meiner anderen Antwort .
Als nächstes werde ich erklären, wie ich verifiziert habe, dass das "angenommene" Bit der Schuldige ist:
Zeit bis hd
it up.
Setup:
%Vor%Dann:
%Vor%Gibt:
%Vor%Jetzt:
%Vor%Gibt:
%Vor%Wenn Sie die beiden Indizes vergleichen und sich die globale Struktur des Indexes ansehen , beachten Sie, dass folgende Unterschiede bestehen:
0x48
(9. Zeile in Zeile 40
) geändert von 00
in 80
. Das ist unser Flag, das erste Bit der Cache-Eingabe-Flags. 0x4C
bis 0x5F
. Dies wird erwartet, da dies eine SHA-1 über den gesamten Index ist. Das hat mir auch, dass die SHA-1 des Indexeintrags in Bytes von 0x34
bis 0x47
die Flags nicht berücksichtigt, da sie sich zwischen beiden Indizes nicht geändert hat. Das ist wahrscheinlich der Grund, warum die Flags hinter dem SHA platziert werden, der nur berücksichtigt, was davor kommt.
Sehen wir nun, ob das mit dem Quellcode von Git 2.3 übereinstimmt.
Sehen Sie sich zuerst die Quelle von update-index an, grep assume-unchanged
.
Dies führt zu der folgenden Zeile :
%Vor%, so wird der Wert in mark_valid_only
gespeichert. Grep und finde, dass es nur an einer Stelle verwendet wird >:
CE
bedeutet Cache-Eintrag.
Durch die schnelle Überprüfung von mark_ce_flags sehen wir Folgendes:
%Vor% Also setzt die Funktion das CE_VALID
-Bit, abhängig von mark_valid_only
, was ein Tristate ist:
--assume-unchanged
--no-assume-unchanged
0
der Option, die auf {OPTION_SET_INT, 0
gesetzt wurde
Als nächstes, indem wir unter builtin/
gräten, sehen wir, dass kein anderer Ort den Wert von CE_VALID
festlegt, also muss --assume-unchanged
der einzige Befehl sein, der es setzt.
Das Flag wird jedoch an vielen Stellen des Quellcodes verwendet, was erwartet werden sollte, da es viele Nebenwirkungen hat, und es wird jedes Mal wie folgt verwendet:
%Vor% Wir schließen daraus, dass es Teil des Feldes ce_flags
von struct cache_entry
.
Der Index wird unter cache.h
angegeben, da eine seiner Funktionen ein Cache zum schnelleren Erstellen von Commits sein soll.
Wenn Sie sich die Definition von CE_VALID
unter cache.h
und der Umgebung ansehen Zeilen, die wir haben:
Daraus schließen wir, dass es das allererste Bit dieser Ganzzahl ist ( 0x8000
), direkt neben der CE_EXTENDED
, was mit mein früheres Experiment .