464 Stimmen

Datei in einem Git Repo aufbewahren, aber Änderungen nicht verfolgen

Ich muss einige Dateien in mein GitHub-Repository aufnehmen, aber keine Änderungen an ihnen verfolgen. Wie kann ich das bewerkstelligen? Ein Beispiel für einen Anwendungsfall ist eine Datei, die vertrauliche Benutzerinformationen wie Anmeldedaten enthält.

Wenn ich zum Beispiel eine neue Installation dieses Frameworks auf einem neuen Client einsetze, möchte ich, dass die folgenden Dateien heruntergeladen werden (sie haben die Standardwerte CHANGEME) und ich muss nur noch Änderungen vornehmen, die für diesen Client spezifisch sind (Datenbankanmeldeinformationen, E-Mail-Adressen, 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

Wenn ich derzeit

git clone git@github.com:user123/myRepo.git httpdocs

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

0 Stimmen

794voto

nasirkhan Punkte 9448

Git hat eine andere Lösung für diese Aufgabe. Ändern Sie zunächst die Datei, die nicht verfolgt werden soll, und verwenden Sie den folgenden Befehl:

git update-index --assume-unchanged FILE_NAME

und wenn Sie die Änderungen erneut verfolgen wollen, verwenden Sie diesen Befehl:

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

git-update-index Dokumentation

0 Stimmen

Ich habe getan, was Sie sagen, aber Git-Status halten Sie die Datei geändert wird

0 Stimmen

Bei mir funktioniert das sehr gut. Haben Sie die Meldung "Datei kann nicht markiert werden..." erhalten, als Sie es versucht haben?

0 Stimmen

Hier funktioniert es - endlich verursacht mein 2-stufiger Einsatz keine ständigen unkontrollierten Änderungen mehr. DANKE @nasirkhan !!!

176voto

Anthony Punkte 11974

Um eine Antwort aus den Kommentaren einer anderen Antwort herauszuziehen:

$ git update-index --skip-worktree FILENAME

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

Mehr darüber können Sie hier lesen: Git - Unterschied zwischen 'assume-unchanged' und 'skip-worktree'

4 Stimmen

1 Stimmen

Wenn ich dies tue und dann versuche, den Zweig zu wechseln, erhalte ich die Meldung "Die folgenden nicht nachverfolgten Arbeitsbaumdateien würden durch das Auschecken überschrieben werden... Bitte verschieben oder entfernen Sie sie, bevor Sie den Zweig wechseln". Irgendwelche Ideen, wie man das vermeiden kann?

1 Stimmen

Der von @aexl referenzierte Artikel wurde verschoben nach Erfolgreich kompiliert.dev/git-skip-worktree

69voto

superiggy Punkte 993

Für meine Code Igniter-Projekte behalte ich datenbank.php.beispiel y config.php.example in der Repo.

Dann füge ich hinzu config.php y anwendungen/konfiguration/datenbank.php zum .gitignore Datei.

So kann ich endlich beim Deployment die .example-Dateien (nach config.php und database.php) kopieren, sie anpassen und sie werden nicht von GIT verfolgt.

0 Stimmen

Das ist keine gute Lösung. Wenn Sie Ihren Git-Index flushen, fangen Sie an, Änderungen zu verfolgen, obwohl Sie das gar nicht wollen. Siehe @nasirkhans Antwort für die korrekte Vorgehensweise.

3 Stimmen

Ich stimme den beiden vorherigen Kommentaren nicht zu. Auf diese Weise ist es viel einfacher, die "Standard"-Werte zu aktualisieren, ohne sie auschecken und die lokale Konfiguration woanders hin kopieren zu müssen, nur um sie danach wieder einzusetzen. Außerdem gilt es für alle Repositories, so dass man keine wiederholten Repo-Änderungen vornehmen muss.

2 Stimmen

Wenn es in Gitignore ist, warum sollte es dann wieder anfangen, Änderungen zu verfolgen

23voto

houtanb Punkte 3722

Der empfohlene Weg, ab Git-Version 2.25.1, ist es, die Vorlagen der Dateien im Repository zu verfolgen, sie in neue Dateien zu kopieren und sie lokal zu ändern (wobei der neue Dateiname in .gitignore ) ( von hier aus ):

Benutzer versuchen oft, die Bits assume-unchanged und skip-worktree zu verwenden, um Git anzuweisen, Änderungen an Dateien, die verfolgt werden, zu ignorieren. Das funktioniert nicht funktioniert nicht wie erwartet, da Git immer noch Arbeitsbaumdateien gegen den Index abgleichen kann, wenn bestimmte Operationen durchgeführt werden. Im Allgemeinen bietet Git keine keine Möglichkeit, Änderungen an verfolgten Dateien zu ignorieren, so dass alternative Lösungen empfohlen.

Wenn es sich bei der Datei, die Sie ändern möchten, beispielsweise um eine Art Konfigurationsdatei handelt Datei ist, kann das Repository eine Beispielkonfigurationsdatei enthalten, die dann unter dem ignorierten Namen kopiert und geändert werden kann. Das Projektarchiv kann sogar ein Skript enthalten, das die Beispieldatei als Vorlage behandelt und automatisch kopiert wird.

0 Stimmen

Das Duplizieren von Dateien ist eine vernünftige Lösung. Das Problem besteht darin, dass wir versuchen, verschiedene Versionen einer Datei auf verschiedenen Rechnern zu verwalten. Das lässt sich besser als völlig unterschiedliche Dateien modellieren - eine für jeden Rechner. Wenn Sie die verschiedenen Dateivarianten von einer anderen gemeinsamen Datei aus referenzieren müssen, stehen Sie leider immer noch vor demselben Problem einer Datei, die auf verschiedenen Rechnern unterschiedlich ist. Der Vorteil ist jedoch, dass die Vorlagen für doppelte Dateien einen Mechanismus zur Selbstdokumentation schaffen, und dass ein Fehler weniger schmerzhaft ist.

3voto

Michael Durrant Punkte 88734

Ich würde sie in Ihr .gitignore Datei und kopieren Sie sie bei Bedarf einfach manuell.

Der Skelett-Dateiname wäre also in git, die Ignore-Dateinamen wären nicht in git (sondern in .gitignore). Auf diese Weise werden sie sofort ignoriert, wenn der manuelle Schritt zum Kopieren nach "actual" von "template" (vielleicht ein besserer Name als skeleton) durchgeführt wird.

3 Stimmen

Gibt es keine Möglichkeit, sie zuerst in das Projektarchiv aufzunehmen und sie dann zu .gitignore hinzuzufügen? Es wäre toll, wenn es eine Lösung dafür gäbe, die Dateien aufzunehmen, aber keine Änderungen nach einem bestimmten Commit oder so.

1 Stimmen

@mklauber Ich möchte sie auf unbestimmte Zeit behalten, bis ich laufe git rm <file> . Der Zweck ist IE: eine config.php-Datei. Ich möchte die config-Datei zu halten, aber ich natürlich nicht wollen, um die Datenbank-Anmeldeinformationen von Client zu Client zu verfolgen, da sie unterschiedlich sind.

1 Stimmen

Ja, ich habe das Problem mit unserer Rails database.yml Datei. Wir halten ein Skelett und dann kopieren und ändern Sie es.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X