Ich habe eine Standardversion einer Datei erstellt, die in einem Git-Repository enthalten ist. Es ist wichtig, dass jemand, der das Repository klont, eine Kopie dieser Datei erhält. Ich möchte jedoch git so einstellen, dass Änderungen an dieser Datei später ignoriert werden. .gitignore
funktioniert nur bei nicht verfolgten Dateien.
Meine Motivation ist, dass diese Datei maschinenspezifische Informationen enthält. Ich möchte Standardwerte bereitstellen und gleichzeitig zulassen, dass Benutzer lokale Änderungen vornehmen, die nicht in das Ursprungs-Repository zurückgeschoben werden, und beim Zusammenführen neuer Änderungen Zusammenführungskonflikte verursachen.
Wir sind im Allgemeinen ziemlich faul und verwenden git add .
viel. Wenn ich git nicht anweisen kann, diese Datei zu ignorieren, werden Änderungen daran letztendlich festgeschrieben und gepusht.
Zusammenfassen,
- Ich möchte eine Datei erstellen, sie aufrufen
default_values.txt
, die meinem Git-Repository hinzugefügt wird und enthalten ist, wenn jemand dieses Repository klont. git add .
sollte nichtdefault_values.txt
zum Commit hinzugefügt werden .- Dieses Verhalten sollte an alle Klone des Repositorys weitergegeben werden.
quelle
Antworten:
Wie viele andere bereits erwähnt haben, ist eine gute moderne Lösung:
Dadurch werden Änderungen an dieser Datei, sowohl lokal als auch vorgelagert, ignoriert, bis Sie sie erneut zulassen mit:
Sie können eine Liste der Dateien erhalten, die als übersprungen markiert sind:
Beachten Sie, dass im Gegensatz dazu
--skip-worktree
der--assume-unchanged
Status verloren geht, sobald eine vorgelagerte Änderung vorgenommen wird.quelle
--no-skip-worktree
, um ihre Änderungen hinzuzufügen.--skip-worktree
Status einer Datei rückgängig machen müssen, bevor Sie die Verzweigung wechseln können, wenn dieselbe Datei in der anderen Verzweigung verfolgt wird.git status
, aber als ich versuchte, in einen anderen Zweigerror: Your local changes to the following files would be overwritten by checkout:
error: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
git ignore
undgit unignore
.Was Sie suchen, ist
git update-index --assume-unchanged default_values.txt
.Weitere Informationen finden Sie in den Dokumenten: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html
quelle
skip-worktree
anstelle vonassume-unchanged
mehr Info stackoverflow.com/questions/13630849/…Der Ansatz, den ich allgemein gesehen habe, besteht darin, eine Datei mit einem anderen Namen zu erstellen, z. B. default_values_template.txt, und default_values.txt in Ihren .gitignore einzufügen. Weisen Sie die Benutzer an, default_values_template.txt in default_values.txt in ihren lokalen Arbeitsbereichen zu kopieren und bei Bedarf Änderungen vorzunehmen.
quelle
.sample
Suffix. Also in deinem Falldefault_values.txt.sample
Schauen Sie sich Smudge / Clean Scripting an. Auf diese Weise können Sie die Versionskontrolle der Datei durchführen, aber wenn sie ausgecheckt ist, "verwischen" Sie sie, indem Sie die generischen Daten / Platzhalterdaten durch maschinenspezifische Daten in der Datei ersetzen.
Wenn Sie es festschreiben, "bereinigen" Sie es, indem Sie die maschinenspezifischen Informationen durch allgemeine Informationen oder Platzhalterinformationen ersetzen.
Smudge / Clean-Skripte müssen dahingehend deterministisch sein, dass sie mehrmals angewendet werden. In unterschiedlichen Reihenfolgen entspricht dies nur dem Ausführen des letzten Skripts in der Sequenz.
Dasselbe kann mit Kennwörtern angewendet werden, wenn Sie Ihr Repository verfügbar machen müssen, der Inhalt jedoch vertrauliche Informationen enthalten kann.
quelle
user.json
einrichten, dessen Standard mit den Creds jedes Entwicklers überschrieben werden muss, aber ich möchte nicht, dass der Entwickler versehentlich seine Creds eincheckt.Ich habe dieses Problem gelöst, indem ich den Filter "sauber" definiert habe, um einfach den Inhalt der Datei im Index zu erfassen.
git show :path/to/myfile
sollte nur den Inhalt des Index für die angegebene Datei drucken, damit wir diesen in einem Skript verwenden können, um die Arbeitskopie durch die unberührte Kopie im Index zu ersetzen:Legen Sie dies als "sauberen" Filter für die betreffende Datei fest (vorausgesetzt, Sie haben dies in "discard_changes" eingefügt):
Leider kann ich keinen Weg finden, dies auf mehrere Dateien verallgemeinerbar zu machen, da es keine Möglichkeit gibt, innerhalb des sauberen Skripts zu erkennen, welche Datei wir verarbeiten. Natürlich hindert Sie nichts daran, für jede Datei eine andere Filterregel hinzuzufügen, aber es ist etwas umständlich.
quelle
Ich habe eine Lösung gefunden, die für mein Team funktioniert. Wir teilen unsere Githooks über Symlinks und nachdem ich eine Vorlagendatei zu Git hinzugefügt habe, habe ich einen Pre-Commit-Hook hinzugefügt, der prüft, ob die Vorlagendatei geändert wurde und wenn ja
git reset -- templatefile.txt
. Wenn es die einzige geänderte Datei ist, brich ich auch das Commit ab.quelle
Ich schlage vor, Submodule zu untersuchen. Wenn Sie die maschinenspezifischen Dateien in einem Submodul ablegen, sollte git add dies ignorieren.
quelle