Ich glaube nicht, dass ein Git-Commit eine Absicht wie "Verfolgen Sie die Verfolgung dieser Datei, aber löschen Sie sie nicht" aufzeichnen kann.
Um eine solche Absicht zu verwirklichen, muss außerhalb von Git in alle Repositorys eingegriffen werden, die ein Commit zusammenführen (oder neu aufbauen), bei dem die Datei gelöscht wird.
Kopie speichern, Löschung anwenden, Wiederherstellen
Am einfachsten ist es wahrscheinlich, Ihre nachgeschalteten Benutzer anzuweisen, eine Kopie der Datei zu speichern, Ihre Löschung abzurufen und die Datei dann wiederherzustellen. Wenn sie über Rebase ziehen und Änderungen an der Datei "tragen", kommt es zu Konflikten. Verwenden Sie zum Lösen solcher Konflikte git rm foo.conf && git rebase --continue
(wenn das widersprüchliche Commit neben den Änderungen an der entfernten Datei Änderungen aufweist) oder git rebase --skip
(wenn sich das widersprüchliche Commit nur in der entfernten Datei geändert hat).
Stellen Sie die Datei als nicht verfolgt wieder her, nachdem Sie einen Commit gezogen haben, der sie löscht
Wenn sie Ihr Lösch-Commit bereits gezogen haben, können sie die vorherige Version der Datei mit git show wiederherstellen :
git show @{1}:foo.conf >foo.conf
Oder mit Git Checkout (laut Kommentar von William Pursell; aber denken Sie daran, ihn wieder aus dem Index zu entfernen!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
Wenn sie seit dem Abrufen Ihrer Löschung andere Maßnahmen ergriffen haben (oder mit Rebase in einen abgetrennten HEAD ziehen), benötigen sie möglicherweise etwas anderes als @{1}
. Sie können git log -g
das Commit verwenden, bevor sie Ihre Löschung vorgenommen haben.
In einem Kommentar erwähnen Sie, dass die Datei, die Sie "aufspüren, aber behalten" möchten, eine Art Konfigurationsdatei ist, die zum Ausführen der Software erforderlich ist (direkt aus einem Repository).
Behalten Sie die Datei als 'Standard' bei und aktivieren Sie sie manuell / automatisch
Wenn es nicht völlig inakzeptabel ist, den Inhalt der Konfigurationsdatei weiterhin im Repository zu verwalten, können Sie die verfolgte Datei möglicherweise von (z. B.) foo.conf
in umbenennen foo.conf.default
und Ihre Benutzer cp foo.conf.default foo.conf
nach dem Anwenden des Umbenennungs-Commits anweisen . Wenn die Benutzer bereits einen vorhandenen Teil des Repositorys verwenden (z. B. ein Skript oder ein anderes Programm, das durch den Inhalt des Repositorys konfiguriert ist (z. B. Makefile
oder ähnliches)), um Ihre Software zu starten / bereitzustellen, können Sie einen Standardmechanismus in den Start / integrieren. Bereitstellungsprozess:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
Mit einem solchen Standardmechanismus sollten Benutzer in der Lage sein, ein Commit abzurufen, foo.conf
in das umbenannt wird, foo.conf.default
ohne zusätzliche Arbeit leisten zu müssen. Außerdem müssen Sie eine Konfigurationsdatei nicht manuell kopieren, wenn Sie in Zukunft zusätzliche Installationen / Repositorys vornehmen.
Das Umschreiben des Verlaufs erfordert ohnehin manuelle Eingriffe…
Wenn es nicht akzeptabel ist, den Inhalt im Repository zu verwalten, möchten Sie ihn wahrscheinlich mit so etwas wie vollständig aus dem Verlauf entfernen git filter-branch --index-filter …
. Dies entspricht einem Umschreiben des Verlaufs, für das für jeden Zweig / jedes Repository ein manueller Eingriff erforderlich ist (siehe Abschnitt „Wiederherstellen von Upstream-Rebase“ in der Manpage zur Git-Rebase ). Die spezielle Behandlung, die für Ihre Konfigurationsdatei erforderlich ist, ist nur ein weiterer Schritt, den Sie beim Wiederherstellen nach dem Umschreiben ausführen müssen:
- Speichern Sie eine Kopie der Konfigurationsdatei.
- Erholen Sie sich vom Umschreiben.
- Stellen Sie die Konfigurationsdatei wieder her.
Ignorieren Sie es, um Wiederholungen zu vermeiden
Unabhängig von der verwendeten Methode möchten Sie wahrscheinlich den Konfigurationsdateinamen in eine .gitignore
Datei im Repository aufnehmen, damit niemand versehentlich git add foo.conf
wieder darauf zugreifen kann (dies ist möglich, erfordert jedoch -f
/ --force
). Wenn Sie mehr als eine Konfigurationsdatei haben, können Sie sie alle in ein einziges Verzeichnis verschieben und das Ganze ignorieren (mit "Verschieben" meine ich das Ändern, wo das Programm seine Konfigurationsdateien erwartet, und das Abrufen der Benutzer (oder) der Start / deploy - Mechanismus) zum kopieren / die Dateien auf ihre neue Position verschieben, würden Sie wollen natürlich nicht auf mv git eine Datei in ein Verzeichnis , dass Sie ignorieren).