Der Unterschied zwischen „Datei in nie geprüft wurde und .gitignored“ vs. „die Datei in aber dann rm-ed geprüft und hat seitdem. gittigored "ist weniger als du folgst. Wenn die Datei nie hinzugefügt und in .gitignore eingefügt hat, hätte es wie erwartet funktioniert. Nachdem Sie die Datei entfernt haben, können Sie sie in .gitignore einfügen und nach eventuell einer Schwierigkeitsstufe sollte sie anfangen zu arbeiten.
(Das wäre der Fall, zum Beispiel, wenn Sie git pull
verwenden, um die Server zu aktualisieren Der Pull von der Commit, dass die Datei möglicherweise löschen Sie die Datei gelöscht -. Obwohl es als Konflikt auftauchen sollte.Aber nachfolgende Pulls würden die Datei ignorieren, besonders wenn Sie sie seit .gitigore hinzugefügt haben. Aber ich schweife ab, und ich habe meine Verwirrung hier in den Kommentaren abgedeckt ...)
So war die Frage, wie Sie eine Datei aus dem Verlauf entfernen, als ob es nie hinzugefügt worden wäre, und während ich bezweifle, dass es helfen wird, Hier ist, wie Sie es tun können:
Sie müssen die Commit (oder commits), die die Datei eingeführt hat, "neu schreiben", sowie jede Commit von einem solchen Commit abstammen. Wenn dies ein gemeinsam genutztes Repository ist, müssen alle nach dem Neuschreiben auf das Neuschreiben umsteigen - am einfachsten, wenn alle ihre aktuellen Repos verwerfen und erneut klonen. Dies bedeutet, dass Sie ein Fenster "keine Änderung" koordinieren müssen; Wenn jemand nach dem Cut-Off am Anfang dieses Fensters eine Änderung vornimmt, muss er in den umgeschriebenen Baum rebasiert werden.
Nun, wenn die Datei kürzlich hinzugefügt wurde und nicht viel Geschichte nach der Festschreibung, die es eingeführt hat, dann kann dies ein relativ einfacher Prozess sein, und Sie können sogar einige Verknüpfungen nehmen. Aber die allgemeine Lösung ist entweder git filter-branch
oder der BFG Repository Cleaner zu verwenden.
Von den beiden ist BFG einfacher und schneller (da dies eine der Aufgaben ist, die speziell dafür entwickelt wurde). Der Autor glaubt, dass die einzige sichere Prozedur darin besteht, die Datei manuell von aktuellen Commits zu entfernen, zu testen, dass alles im aktuellen Commit wie erwartet funktioniert, und dann BFG zu verwenden, um den Verlauf zu bereinigen. Ich denke, das ist zu pedantisch und hat ihm erklärt warum, aber er besteht darauf; du musst dich also selbst entscheiden.
Wenn Sie filter-branch
verwenden, verwenden Sie einen Indexfilter; Es ist eines der Beispiel-Beispiele in der Git-Filter-Dokumentation, also würde ich es einfach dort nachschlagen.
Wie implementieren Sie? Da du nur Git aufführst, würde ich schlussfolgern, dass du durch einen Git Pull ziehst; aber das sollte sich nicht so verhalten, wie du es beschrieben hast. Der Pull * des Commits, mit dem die Datei * gelöscht wurde, löscht möglicherweise die Datei (wenn die lokale Datei jedoch nicht mit der letzten Version in Git übereinstimmt, sollte sie als Konflikt angezeigt werden); Aber nachdem die Datei wieder an ihrem Platz ist, sollten nachfolgende Pulls (von Commits, die keine Beziehung zu der Datei haben) die Datei nicht beeinflussen. Die Datei sollte als "untracked" angezeigt werden, außer Sie .gitignore es. Das heißt ... –
... da das Verhalten, das Sie beschreiben, sich von dem unterscheidet, was git tun sollte, vermute ich, dass Sie eine andere Methode zum Deployment verwenden. Wenn Sie jedoch * eine andere Methode zum Bereitstellen verwenden, hat die Tatsache, dass die Datei einmal in git war, keinerlei Auswirkungen auf den Bereitstellungsprozess. Alles in allem werde ich eine Antwort geben, die die gestellte Frage anspricht; aber ich denke, eine Klarstellung dieses Punktes wäre nützlich. –
@MarkAdelsberger hat recht: Git wird * nur * die Datei auf einem 'git checkout' löschen, das von einer Situation, in der die Konfigurationsdatei im Index und im Arbeitsbaum ist, zu einem Commit führt, wo die Konfigurationsdatei ist * nicht anwesend. Jedes Mal, wenn Sie zu einem Commit wechseln, das die Datei enthält, dann zu einem, das * nicht *, wird Git die Datei ersetzen und entfernen (sofern es erlaubt ist, entweder weil es keine Änderungen in index + work gibt) -tree oder weil du '--force' benutzt hast. Daher ist "Wie installierst du" eine entscheidende Frage. – torek