Wie kann ich verhindern, dass Git Änderungen an einer Datei ab diesem Commit nachverfolgt?

77

Ich habe eine Datenbankkonfigurationsdatei mit Standardwerten, die unwichtig sind. Änderungen an dieser Datei enthalten jedoch vertrauliche Informationen, die im Repo nicht nachverfolgt werden sollten.

Ich möchte, dass zukünftige Pulls des Git-Repositorys die Standardversion enthalten, aber alle von Benutzern vorgenommenen Änderungen ignorieren.

Im Folgenden wird eine lokale Konfiguration beibehalten, der Löschvorgang wird jedoch an das Repo weitergeleitet, was zu Problemen bei zukünftigen Pulls führt.

cat "app/dir/config.file" >> .gitignore
git rm --cached app/dir/config.file

Das Folgende erledigt den Job, bleibt aber nicht über den Push zum Repo hinaus bestehen.

git update-index --assume-unchanged app/dir/config.file

Dies scheint eine häufige Anforderung für die Versionskontrolle vertraulicher Informationen zu sein, aber ich kann anscheinend keine Lösung finden.

Ben Campbell
quelle
3
Normalerweise erstelle ich eine config.file.dist, die Standardkonfigurationswerte enthält, und lege diese fest. Wenn eine Kopie ausgecheckt ist, kopieren Sie einfach die .distDatei, um eine tatsächliche Konfigurationsdatei zu erstellen, und geben Sie die Werte ein, die Sie ändern möchten.
Paul
1
Das scheint der allgemeine Konsens zu sein. Wenn Sie nicht möchten, dass es versioniert wird, verfolgen Sie es zunächst nicht oder verfolgen Sie eine Vorlage, die der Benutzer implementiert. Ich fange an zu denken, dass ich versuche, eine Schraube falsch zu hämmern.
Ben Campbell
Mögliches Duplikat von Committing Machine Specific Configuration Files
Senseful

Antworten:

174

Wie immer hat Github ein großartiges Dokument dazu.

https://help.github.com/articles/ignoring-files#ignoring-versioned-files

Hier ist der relevante Ausschnitt:

Versionsdateien ignorieren

Einige Dateien in einem Repository ändern sich häufig, werden jedoch selten festgeschrieben. In der Regel handelt es sich dabei um verschiedene lokale Konfigurationsdateien, die bearbeitet werden, jedoch niemals im Upstream festgeschrieben werden sollten. Mit Git können Sie diese Dateien ignorieren, indem Sie davon ausgehen, dass sie unverändert sind.

  1. Navigieren Sie im Terminal zum Speicherort Ihres Git-Repositorys.
  2. Führen Sie den folgenden Befehl in Ihrem Terminal aus:

git update-index --assume-unchanged path/to/file.txt

Sobald Sie eine Datei wie diese markieren, ignoriert Git alle Änderungen daran vollständig. Es wird niemals beim Laufen angezeigt git statusoder git diffwird jemals festgeschrieben.

Führen Sie einfach Folgendes aus, damit Git die Datei erneut verfolgt:

git update-index --no-assume-unchanged path/to/file.txt.

rauben
quelle
54
Die erste Antwort auf diese Frage gibt an, dass --assume-unchangedeine lokale Einstellung festgelegt wird. Das bedeutet, dass ein neuer Entwickler jedes Mal, wenn er klont, --assume-unchangedjede zutreffende Datei benötigt. Wie kann dieses Verhalten propagiert werden?
Edward Newell
11
Ich bin froh, dass Sie diesen Abschnitt zitiert haben, da GitHub ihn inzwischen von dieser Seite entfernt hat.
Justin
Ort in der Dokumentation: git-scm.com/docs/…
mtpultz
@ EdwardNewell Nach Protokoll. Fügen Sie die relevanten Dateien in eine Datei mit dem Namen .git-assume-unchanged(oder etwas anderem) ein. Führen Sie dann den Befehl aus, mit dem Sie Ihre Projektkonfigurationen einrichten cat .git-assume-unchanged | xargs git update-index --assume-unchanged. Am besten nehmen Sie auch Aliase auf, um diese in Ihrer Projektkonfiguration festzulegen und zu deaktivieren.
DylanYoung
7

Ich bin mir nicht sicher, ob dies der "beste" Weg ist ... aber was ich gefunden habe, um zu funktionieren, dauert ein paar Schritte.

Neues Laravel-Beispiel:

  1. git init
  2. Passen Sie die .gitignoreDateien an die gewünschten Ergebnisse an, ohne die Ordner des Anbieters zu verlieren.
  3. Erstellen Sie eine Kopie der Dateien, die nicht verfolgt werden sollen (z. B. .htaccess, .env usw.).
  4. git add .
  5. git commit -m "first commit"
  6. git rm --cached public /.htaccess dann git rm --cached .env
  7. git commit
  8. git status sollte diese Dateien als gelöscht anzeigen.
  9. Legen Sie nun die kopierte Datei zurück. Da sie denselben Namen haben wie git, den Sie aus dem Tracking entfernen sollen, ignoriert git diese Dateien jetzt vollständig.

Jetzt können diese bearbeitet werden und Sie können lokale und Produktionsversionen haben. HINWEIS: Möglicherweise müssen Sie alle diese Schritte auch beim ersten Produktionsaufbau wiederholen. Bisher hat das bei mir gut funktioniert.

Bikermusiker
quelle