Behalten Sie die Datei in einem Git-Repo, aber verfolgen Sie keine Änderungen

305

Ich habe mehrere Dateien auf einer CodeIgniter-Site, die ich im Repo haben möchte, aber keine Änderungen nachverfolgen kann.

Ich stelle beispielsweise eine Neuinstallation dieses Frameworks auf einem neuen Client bereit, möchte, dass die folgenden Dateien heruntergeladen werden (sie haben die Standardwerte CHANGEME) und ich muss nur Änderungen vornehmen, die für diesen Client spezifisch sind (Datenbankanmeldeinformationen, E-Mail-Adressinformationen, Benutzerdefinierte CSS).

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

Zur Zeit wenn ich renne

git clone [email protected]:user123/myRepo.git httpdocs

und dann bearbeiten Sie die Dateien oben, alles ist großartig. Bis ich einen Hotfix oder Patch veröffentliche und starte git pull. Alle meine Änderungen werden dann überschrieben.

gorelativ
quelle
Sie könnten einfach Client-Anmeldeinformationen / Konfigurationsdateien ignorieren und das Programm Standarddateien erstellen lassen, wenn diese bei der Installation des Repos fehlen.
MatthewG

Antworten:

618

Git hat eine andere Lösung, um dies zu tun. Ändern Sie zuerst die Datei, die nicht verfolgt werden soll, und verwenden Sie den folgenden Befehl:

git update-index --assume-unchanged FILE_NAME

Wenn Sie die Änderungen erneut verfolgen möchten, verwenden Sie diesen Befehl:

git update-index --no-assume-unchanged FILE_NAME

git-update-index Dokumentation

Nasirkhan
quelle
Ich habe getan, was du sagst, aber der Git-Status sagt immer wieder, dass die Datei geändert wurde
rraallvv
7
Ja, dies sollte die "Akzeptierte Antwort" sein. Hat für mich gearbeitet.
Joshmcode
34
Laut Junio ​​Hamano (dem Betreuer von Git): "Angenommen, unverändert sollte nicht für einen Ignoriermechanismus missbraucht werden. [...] Es ist kein Versprechen von Git, dass Git diese Pfade immer als unverändert betrachtet - wenn Git kann feststellen, dass sich ein Pfad, der als unverändert markiert ist, geändert hat, ohne dass zusätzliche lstat (2) -Kosten anfallen, behält sich das Recht vor, zu melden, dass der Pfad geändert wurde (daher kann "git commit -a" dies frei festschreiben Veränderung)." Mit anderen Worten, angenommen, dass unverändert nur für lokale Leistungsprobleme gilt. Wenn Git feststellen kann, dass sich diese Dateien leichter geändert haben, wird dies der Fall sein.
Alejandro García Iglesias
41
Wenn ich die Informationen dazu lese, denke ich, dass die --skip-worktreeOption für diesen Job besser geeignet ist als --assume-unchanged.
PJSCopeland
26
--skip-worktree ist in der Tat die bessere Option. Weitere Informationen: stackoverflow.com/questions/13630849/…
Customizer
80

So ziehen Sie eine Antwort aus den Kommentaren einer anderen Antwort heraus:

$ git update-index --skip-worktree FILENAME

Scheint eine bessere Option zu sein als --assume-unchanged

Mehr dazu lesen Sie hier: Git - Unterschied zwischen 'unverändert annehmen' und 'Arbeitsbaum überspringen'

Anthony
quelle
Wenn ich dies tue und dann versuche, Zweige zu wechseln, wird "Die folgenden nicht verfolgten Arbeitsbaumdateien werden beim Auschecken überschrieben ... Bitte verschieben oder entfernen Sie sie, bevor Sie die Zweige wechseln". Irgendwelche Ideen, wie man das vermeidet?
Patrick Szalapski
Der Artikel, auf den @aexl verweist, wurde
Andrew Keeton
1
Die Dokumente sagen, dass dies eine schlechte Idee ist. "Benutzer versuchen häufig, die Bits" Unverändert annehmen "und" Arbeitsbaum überspringen "zu verwenden, um Git anzuweisen, Änderungen an nachverfolgten Dateien zu ignorieren. Dies funktioniert nicht wie erwartet, da Git bei bestimmten Vorgängen möglicherweise weiterhin Arbeitsbaumdateien anhand des Index überprüft. Im Allgemeinen bietet Git keine Möglichkeit, Änderungen an nachverfolgten Dateien zu ignorieren. Daher werden alternative Lösungen empfohlen. "
Curtis Blackwell
58

Für meine Code Igniter-Projekte behalte ich database.php.example und config.php.example im Repo.

Dann füge ich der .gitignore- Datei config.php und applications / config / database.php hinzu .

Wenn ich sie bereitstelle, kann ich die Beispieldateien (in config.php und database.php) kopieren, anpassen und sie werden von GIT nicht verfolgt.

Superiggy
quelle
12
Gute Lösung, aber ich denke, Nasirkhans Antwort ist die beste.
Worte für den
Dies ist keine gute Lösung. Wenn Sie Ihren Git-Index leeren, werden Sie Änderungen nachverfolgen, wenn Sie dies nicht möchten. Siehe @nasirkhans Antwort für den richtigen Weg, dies zu tun.
Brian Melton-Grace - MSFT
3
Ich bin mit beiden vorherigen Kommentaren nicht einverstanden. Auf diese Weise ist es viel einfacher, die "Standard" -Werte zu aktualisieren, ohne sie auschecken und Ihre lokale Konfiguration an eine andere Stelle kopieren zu müssen, um sie anschließend wieder zu speichern. Dies gilt auch für alle Repositorys, sodass Sie keine wiederholten Repo-Änderungen vornehmen müssen.
OskarD90
1
Wenn es in Gitignore ist, warum sollte es dann wieder Änderungen verfolgen
Shapeshifter
Löst das OP-Problem, beantwortet die Frage jedoch nicht wirklich.
Travis Wilson
1

Ich würde sie in Ihre .gitignoreDatei einfügen und sie bei Bedarf einfach manuell kopieren.

Der Skelett-Dateiname wäre also in Git, die Ignorier-Dateinamen wären nicht in Git (sondern in .gitignore). Auf diese Weise werden sie sofort ignoriert, wenn der manuelle Schritt zum Kopieren von "Vorlage" (vielleicht besserer Name als Skelett) in "tatsächlich" ausgeführt wird.

Michael Durrant
quelle
1
Gibt es keine Möglichkeit, sie zuerst zum Repo und dann zu .gitignore hinzuzufügen? Es wäre großartig, wenn es eine Lösung dafür gäbe, die Dateien einzuschließen, aber keine Änderungen nach einem bestimmten Commit oder so.
Gorelative
1
@mklauber Ich möchte sie auf unbestimmte Zeit behalten, bis ich renne git rm <file>. Der Zweck ist IE: eine config.php-Datei. Ich möchte die Konfigurationsdatei behalten, aber ich möchte natürlich nicht die Datenbankanmeldeinformationen von Client zu Client verfolgen, da sie unterschiedlich sind.
Gorelative
1
Ja, ich habe ein Problem mit unserer Rails-Datei database.yml. Wir behalten ein Skelett und kopieren und ändern es dann.
Michael Durrant
Wenn ich diese "Skeleton" -Konfigurationsdateien erstelle, würden Sie sie einem anfänglichen Commit hinzufügen. und dann .gitignore ändern, um die Datei zu ignorieren? Tatsächlich die Datei im Repo behalten, aber als Skelett?
Gorelative
10
Sie haben zwei Möglichkeiten: Fügen Sie die Datei hinzu git add file1und bearbeiten Sie sie anschließend .gitignore. Die festgeschriebene Datei bleibt dort und wird nicht aktualisiert. Oder: Sie können die Datei hinzufügen .gitignoreund dann hinzufügen git add --force file1, um die Datei zu erzwingen. Sie können die zweite Option verwenden, wenn Sie die Datei überschreiben müssen
klaustopher
1

Die Antworten lösen das Problem nur teilweise, führen aber noch mehr Probleme ein.

Ich musste die Datei "Web.Local.config" beibehalten. Die einzige Lösung, die für mich funktioniert hat, war:

1. Schließen Sie die Datei aus dem Projekt aus

2. Erstellen Sie eine separate Kopie der Datei als Web.LocalTemplate.config

Nachdem "Web.LocalTemplate.config" von Git verfolgt wird, können alle Entwickler es als Ausgangspunkt verwenden. Die "Web.Local.config", die nicht Teil des Projekts ist, wird jedoch automatisch ignoriert.

Hrvoje Matić
quelle
Wie git update-index --skip-worktree FILENAMElöst man sein Problem nur teilweise oder fügt sogar noch mehr Probleme hinzu? Es löst genau das, was Sie versuchen zu tun. Hast Du es versucht?
Amir Asyraf