Wie kann ich eine festgeschriebene Datei in Git als schreibgeschützt markieren?

9

Ich habe eine Datei, die in Git eingecheckt ist. Die Datei muss einen API-Schlüssel enthalten, aber ich möchte den API-Schlüssel aus Sicherheitsgründen nicht an Git übergeben. Anstelle eines API-Schlüssels habe ich erläutert, wie ein API-Schlüssel für jeden Entwickler generiert wird.

Ich möchte nicht, dass ein Entwickler versehentlich seinen API-Schlüssel festschreibt und die Basisdatei überschreibt.

Ich habe:

  • Die Datei wurde der .gitignore -Datei hinzugefügt, aber da sie bereits festgeschrieben wurde, macht dies nichts.
  • Lief den Befehl git update-index --assume-unchanged myFile.js
  • Der Erklärung wurde der Befehl hinzugefügt, um andere Entwickler darüber zu informieren, dass sie diesen Befehl auch ausführen sollen.

Ich bin jedoch gerade auf meinen Laptop gegangen, habe vergessen, den Befehl auszuführen, und versehentlich einen Schlüssel für den Repo festgelegt. Ich suche nach einer ausfallsichereren Methode. Im Wesentlichen möchte ich eine erste Version der Datei an GitHub übergeben und dann Modifikationen dieser Datei verbieten.

Ist das möglich?

Als Referenz sieht die Datei etwa so aus:

%Vor%     
Sean Anderson 18.12.2014, 18:44
quelle

4 Antworten

5

Ein möglicher Ansatz wäre die Installation einiger serverseitig hook (zB update ), das wäre

  1. überprüfe in gepushten Referenzen, dass der Hash des fraglichen Blobs gleich bleibt und
  2. lehnt jeden Push ab, der Referenzen enthält, in denen sich der Hash des betreffenden Blobs ändert.

Natürlich würde ein solcher serverseitiger Hook die Mitwirkenden nicht davon abhalten, Commits zu erstellen (lokal auf ihren Rechnern), die eine andere Version der Datei enthalten. Nachdem sie jedoch einige ihrer Stöße zurückgewiesen gesehen hatten, würden sie sicherlich die Lektion lernen. :p

    
Jubobs 18.12.2014, 19:14
quelle
5

Die Antwort auf die implizierte Betreffzeile ("Kann ich git eine bestimmte Datei als schreibgeschützt auschecken") ist "Nein, zumindest nicht direkt", da git nur ein einziges Berechtigungsbit pro Datei speichert: executable oder nicht ausführbar. Alle anderen Bits sind für jede Datei gleich eingestellt.

Allerdings gibt es ein paar Tricks mit Haken. Wie einige Kommentatoren vorgeschlagen haben, können Sie etwas in einem serverseitigen Hook testen, um Push-Angriffe zu vermeiden. Sie können Wisch- und Reinigungsfilter verwenden. Sie können einen post-checkout Hook setzen, der die Datei schreibgeschützt setzt.

Der Nachteil aller Hooks ist, dass sie für jedes Repository eingerichtet werden müssen und Benutzer sie außer Kraft setzen können (mit Ausnahme eines serverseitigen Hooks, vorausgesetzt, der Benutzer hat keinen direkten Zugriff auf den Server). 1 Dies ist auch der Vorteil eines Hooks, obwohl es für naive Benutzer eher ein Nachteil als ein Vorteil ist, da Git selbst die Hooks nicht automatisch einrichten wird.

Der post-checkout Hook ist wahrscheinlich der offensichtlichste Ort, um Dateiberechtigungen festzulegen, da die Dokumentation von git dieses Bit enthält:

  

Dieser Hook kann verwendet werden, um ... die Eigenschaften von Arbeitsverzeichnissen festzulegen.

Praktischerweise wird der Hook immer im Verzeichnis der obersten Ebene ausgeführt, unabhängig davon, wo sich der Benutzer befindet, solange sich der Benutzer tatsächlich in der git work tree befindet. 2 Das ist also sehr einfach hook reicht aus, um eine Datei in schreibgeschützt zu ändern:

%Vor%

(auf jedem System mit chmod auf jeden Fall, und denken Sie daran, den Anschluss als ausführbare Datei einzurichten).

Der Benutzer muss diesen Hook in sein Repository einfügen, in .git/hooks/post-checkout (obwohl Sie die Datei selbst in das Repository übertragen können, und dann den Benutzer kopieren oder verknüpfen, vielleicht durch ein zusätzliches Setup-Skript) .

1 Daher ist ein serverseitiger Hook der richtige Ort, wenn Sie eine Richtlinie strikt durchsetzen wollen (dies gilt im Allgemeinen).

2 Das heißt, das Folgende besiegt den Haken:

%Vor%

Hier ist das aktuelle Arbeitsverzeichnis nur /tmp , und es gibt keine Möglichkeit für den Hook herauszufinden, was es sein soll (Sie können $GIT_DIR lesen, aber das ist nicht unbedingt hilfreich, da das Verzeichnis .git benötigt wird nicht direkt mit dem Arbeitsbaum verbunden sein, und dafür ist die Einstellung GIT_DIR überhaupt gedacht.

Beachten Sie, dass nicht den Hook besiegt, wenn er in der Arbeitsstruktur in einem Unterverzeichnis ist; das ist, was ich meine "scheint immer im obersten Verzeichnis ausgeführt zu werden".

    
torek 18.12.2014 19:16
quelle
1

Wenn Sie nicht möchten, dass Entwickler bestimmte Änderungen in das Repository einfügen, ist es eine gute Lösung, das Repository zu sperren und stattdessen ein Review-System wie Gerrit zu verwenden. Einzelne Änderungen werden stattdessen in Gerrit geschoben und müssen Peer Review bestehen.

Jedes Commit, das eine Datei hinzufügt, die lokal sein soll, wie eine API-Schlüsseldatei oder eine kompilierte Objektdatei, kann zurückgewiesen werden.

Der Entwickler kann dann das Commit überarbeiten, indem er es neu einfügt, um die anstößige Datei nicht einzuschließen, und erneut zur Überprüfung einreichen. Wenn die Überprüfung bestanden wird, wird sie in den entsprechenden Zielzweig übernommen.

    
Kaz 18.12.2014 21:06
quelle
0

Eine andere Lösung ist:

  1. Fügen Sie Ihre Datei dem Repo hinzu, indem Sie sie zuerst umbenennen (als Vorlage), z. %Code%
  2. Weisen Sie Entwickler an, die Vorlage in myFile_template.js zu kopieren und die Details zu bearbeiten
  3. Fügen Sie myFile.js zu myFile.js hinzu

Immer noch keine sehr robuste Lösung, da die Entwickler immer noch die Informationen festschreiben können, die Sie verstecken wollen, aber die Datei wird zumindest nicht in der Statusliste angezeigt.

    
Matt 13.12.2015 22:08
quelle

Tags und Links