2017-03-15 10 views
1

Ich habe eine Konfigurationsdatei in meinem Projekt, die serverspezifisch ist und daher nicht in Git enthalten sein soll, da jedes Mal, wenn wir sie bereitstellen, die Einstellungen für den Server überschrieben werden. Um dieses Problem zu lösen, wurde die Datei von Git gelöscht ... nette Idee, aber jetzt jedes Mal, wenn das Projekt bereitgestellt wird, wird die Server-Konfigurationsdatei gelöscht.Wie kann ich meinem .gitignore eine Datei hinzufügen, ohne sie zu löschen?

So bin ich jetzt mit einem Problem stecken. Was ich wirklich wollte, war, dass die Datei in .gitignore war und nie zum Projekt hinzugefügt wurde, aber sobald sie hinzugefügt wurde, kann ich keine Möglichkeit sehen, sie aus dem Projekt zu entfernen, ohne dass sie bei jeder Implementierung ein Löschen der vorhandenen Datei ausgelöst wird.

Gibt es Möglichkeit, kann ich eine Datei aus einem Projekt entfernen, ohne es zu löschen. Rückwirkend eine Datei ignorieren, die bereits hinzugefügt wurde?

+2

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 ... –

+1

... 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. –

+1

@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

Antwort

0

Sie können die nicht benötigte (n) Datei (en) in der Datei .gitignore angeben. Damit ignoriert Git alle Änderungen der angegebenen Datei (en).

Wenn Sie die Datei .gitignore nicht haben, können Sie sie einfach erstellen und den/die zu ignorierenden Dateinamen eingeben. Denken Sie daran, dass Sie die Datei .gitignore committen müssen, sobald Sie sie dem Repository hinzufügen. Dies weist Git darauf hin, die Datei (en) zu ignorieren, die in der Datei .gitignore angegeben sind.

In kurzen und einfachen Worten. Sie erstellen eine Datei mit dem Namen .gitignore in Ihrem Arbeitsrepository und listen dort den Dateinamen oder das Muster auf, um z. Wenn wir alle .sql Dateien ignorieren wollen. Im .gitignore wird geben wir Folgendes:

*.sql 

Wenn wir nur eine einzelne Datei ignorieren wollen, können lib/util.php sagen. Dann wird die .gitignore wird wie folgt aussehen:

lib/util.php 

Sie mehrere Dateinamen in .gitignore angeben können, wie Sie möchten.

gitignore documentation

Beachten Sie, dass dies im Fall funktioniert nur, wurde die Datei nie im Repository verfolgt mit so richtig durch @ Mark und Adelsberger @torek bemerkt zu beginnen.

+1

Wenn die Datei bereits verfolgt wurde (d. H., in den Index), seinen Pfad in ein '.gitignore' zu ​​setzen hat keine Wirkung. Sie müssen die Datei * un * aufzeichnen lassen, was das OP getan hat. Das Problem ist, dass es dann einen 'git checkout'-Pfad gibt, der die (verfolgte, festgeschriebene) Datei erhält, gefolgt von einem' git checkout' des späteren Commits, der * die Datei aus dem Arbeitsbaum * entfernt. Sobald es aus dem Index ist, ist alles in Ordnung, außer dass die Datei aus dem Arbeitsbaum verschwunden ist: sie muss von irgendwo wiederhergestellt werden (wie der Commit, wo sie vorhanden ist). – torek

0

Verwenden Sie git log --oneline, um eine Liste von Commit-Protokollen zu drucken, und Sie starten eine git reset 'head', um die Dateien zu deaktivieren. Dann können Sie die korrekte .gitignore Vorlage anwenden, bevor Sie die Datei übergeben. Wenn Sie die Dateien noch nicht festgeschrieben haben, können Sie git rm --cached verwenden, um die Dateien zu deaktivieren. Sie können eine Sammlung von gitignore Vorlagen aus dieser Github Seite finden https://github.com/github/gitignore

0

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.

0

Die einfache und sichere Möglichkeit, dies zu beheben, besteht darin, die Dateien, die Sie ausschließen möchten, zu .gitignore hinzuzufügen.

Wenn die Datei bereits verfolgt wird (zuvor hinzugefügt und festgeschrieben), müssen Sie sie auch aus dem Repository löschen. Dies kann durchgeführt werden, ohne die lokale Datei zu löschen, die Sie behalten möchten, indem Sie git nur die verfolgte Version löschen lassen.

git rm --cached <file> ist der Befehl, der dies tun wird. Wenn Sie diese Änderung zusammen mit dem Update .gitignore festschreiben, stoppt das Repository die Verfolgung und beginnt, diese Datei zu ignorieren.

Verwandte Themen