Wo speichert "git update-index --assume-unveränderte Datei" diese Information?

10

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!

    
Mauvis Ledford 18.08.2011, 22:41
quelle

2 Antworten

4

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

    
manojlds 18.08.2011, 22:47
quelle
2

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:

  • empirisch
  • durch Lesen der Quelle

Empirisch

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:

  • Byte-Nummer 0x48 (9. Zeile in Zeile 40 ) geändert von 00 in 80 . Das ist unser Flag, das erste Bit der Cache-Eingabe-Flags.
  • die 20 Bytes von 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.

Quellcode

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 >:

%Vor%

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:

  • Marke: --assume-unchanged
  • Markierung aufheben: --no-assume-unchanged
  • nichts tun: der Standardwert 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:

%Vor%

Daraus schließen wir, dass es das allererste Bit dieser Ganzzahl ist ( 0x8000 ), direkt neben der CE_EXTENDED , was mit mein früheres Experiment .

    
quelle

Tags und Links