189 Stimmen

Wie kann ich mit Git eine Datei in einem Zweig ignorieren, sie aber in einem anderen Zweig festschreiben lassen?

Ich habe ein Projekt, das ich in der Heroku . Der Quellcode-Baum enthält eine Reihe von mp3-Dateien (die Website wird für ein Aufnahmeprojekt sein, an dem ich stark beteiligt war).

Ich würde gerne den Quellcode dafür auf GitHub aber GitHub hat ein 300 MB-Limit für seine kostenlosen Konten. Ich möchte nicht 50 MB meines Limits für eine Reihe von mp3-Dateien verwenden. Natürlich könnte ich sie in den .gitignore Datei, um sie aus meinem Repo herauszuhalten.

Ich stelle jedoch auf Heroku bereit, indem ich git push heroku . Die mp3-Dateien müssen in der Verzweigung vorhanden sein, die ich an Heroku weitergebe, damit sie bereitgestellt werden können.

Im Idealfall würde ich gerne .gitignore die mp3-Dateien in meinem lokalen Master-Zweig, so dass, wenn ich, dass auf GitHub zu schieben, die mp3s sind nicht enthalten. Dann würde ich eine lokale Produktion Zweig, der die mp3s verpflichtet hat, anstatt ignoriert zu halten. Um bereitzustellen, würde ich Master in Produktion zusammenführen, und dann die Produktion Zweig zu Heroku schieben.

Ich kriege das nicht zum Laufen.

Hier ist ein Beispiel für das, was ich zu tun versuche...

$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored

Zu diesem Zeitpunkt wird Foo.ignored in meinem Master-Zweig ignoriert, aber es ist immer noch vorhanden, so dass mein Projekt es verwenden kann.

$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"

Jetzt habe ich einen Zweig mit diesen Dateien, wie ich es will. Wenn ich jedoch zurück zu meinem Master-Zweig wechsle, ist Foo.ignored verschwunden.

Hat jemand einen Vorschlag, wie man das besser einrichten kann?

Bearbeiten: nur um zu klären, ich möchte die mp3-Dateien in beiden Zweigen vorhanden sein, so dass, wenn ich die Website lokal (mit einem der Zweige) die Website funktioniert. Ich will nur die Dateien in einem Zweig ignoriert, so dass, wenn ich zu GitHub pushen sie nicht auch gepusht werden. Normalerweise funktioniert .gitignore gut für diese Art von Sache (d.h. eine lokale Kopie einer Datei, die nicht in einem Push zu einem Remote enthalten ist), aber wenn ich zu dem Zweig mit den Dateien eingecheckt wechseln, und dann zurück zu dem Zweig mit den Dateien ignoriert, verschwinden die Dateien.

0 Stimmen

Warum sind die MP3-Dateien immer in das Repository übertragen werden müssen?

4 Stimmen

Mit heroku ist das Commit zu Ihrem Repo der einzige Weg, um Dateien in Ihre App einzubinden, wenn Sie sie bereitstellen. Die einzige Alternative ist, etwas wie Amazon S3 zu verwenden, um die mp3s zu dienen, aber ich würde es vorziehen, das zu vermeiden.

0 Stimmen

Es klingt, als würden Sie über Dollars stolpern, um Pfennige zu sparen... Die Rackspace Cloud ist sehr einfach einzurichten, und es würde sehr wenig kosten, < 1 GB an Dateien dort zu speichern...

85voto

Cognition.Mind Punkte 1258

Diese Lösung scheint nur bei bestimmten, gepatchten Versionen von Git zu funktionieren. Siehe eine neue Antwort, die auf Umgehungsmöglichkeiten hinweist y eine weitere Antwort und nachfolgende Kommentare für einen Hinweis darauf, welche Versionen funktionieren könnten.

Ich habe einen Blogbeitrag darüber geschrieben, wie man die excludesfile für verschiedene Zweige, z. B. einen für öffentliches Github und einen für Heroku Deployment.

Hier ist die Kurzfassung:

$ git branch public_viewing
$ cd .git/
$ touch info/exclude_from_public_viewing
$ echo "path/to/secret/file" > info/exclude_from_public_viewing 

dann fügen Sie in der Datei .git/config diese Zeilen hinzu:

[core]
excludesfile = +info/exclude

[branch "public_viewing"]
excludesfile = +info/exclude_from_public_viewing

Jetzt befindet sich alles, was mit dem globalen Ignorieren zu tun hat, in der info/exclude Datei und die Zweigspezifikation in der info/exclude_from_public_viewing

http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches

30voto

Murphy Punkte 3485

Wichtiger Hinweis : Die akzeptierte Antwort von Cognition.Mind funktioniert nicht (mehr, seit einigen Jahren, oder vielleicht für Vanilla-Versionen von git); siehe die Kommentare. Eine gültige Antwort und Abhilfe finden Sie hier:

https://stackoverflow.com/a/29583813/2157640

Eine andere Alternative (die bei meinem Problem funktioniert, aber manuelle Versteckoperationen oder die Implementierung eines Hooks erfordert) wäre git stash -u -a . Dies ist mühsam, wenn die Unterschiede groß sind.

Und schließlich ist die Lösung, mit der ich jetzt gehe, nachdem ich meine VM, in der wir unsere Entwicklungsumgebung halten, geforkt habe, und einrichte info/excludes entsprechend für den Zweig, bzw. das Löschen der beanstandeten, nicht übertragenen Dateien/Ordner.

16voto

sapy Punkte 7878

Nehmen wir an, wir wollen Folgendes ignorieren build Ordner aus allen anderen Zweigen außer production Zweigstelle . Da wir die build Ordner in der Produktion.

1) Nicht einbeziehen build in .gitignore . Wenn Sie das tun, wird es immer für alle Zweige ignoriert werden.

2) Erstellen Sie eine Datei exclude_from_public_viewing innerhalb ./.git/info (Dieser Ordner existiert bereits) Ordner touch ./.git/info/exclude_from_public_viewing

3) Innen exclude_from_public_viewing eine Zeile schreiben (Da Sie versuchen, die build f !build

4) Es gibt eine bestehende Datei .git/info/exclude . Wir müssen die folgende Zeile hinzufügen.

 build

Wir wollen ignorieren build Ordner, aber nicht in .gitignore eingetragen. Wie kann Git also wissen, was es ignorieren soll? Die Antwort ist, wir fügen es zu exclude Datei und die bedingte Übergabe dieser Datei an git config

5) Jetzt müssen wir die Ignorierung unter Vorbehalt aufheben build Ordner für production Zweig. Führen Sie dazu Folgendes aus

6) Es gibt eine bestehende Datei namens ./.git/config müssen wir folgendes hinzufügen -

a) excludesfile = +info/exclude unter [core]

[core]
     excludesfile = +info/exclude

b) Erstellen Sie einen neuen Abschnitt am Ende von ./.git/config como

[branch "production"]
    excludesfile = +info/exclude_from_public_viewing

Lösung 2

Es gibt eine intelligente Alternativlösung. Nehmen wir an, Sie möchten Folgendes hinzufügen build/ Ordner in production Zweig und ignorieren ihn in allen anderen Zweigen.

1) Fügen Sie es zu Ihrem gitignore Datei.

2) Im Produktionszweig, während Sie git add hinzufügen, erzwingen build Ordner: git add -f --all build/

14voto

David Dollar Punkte 2409

Ich würde dringend empfehlen, diese MP3-Dateien auf S3 zu speichern. Wenn sie Teil Ihres Heroku-Pushs (und damit Teil Ihres Heroku-Slugs) sind, wird die Startzeit Ihres Dynos stark verlangsamt. Da Heroku EC2 nutzt, zahlen Sie, wenn die Dateien auf S3 liegen und nur von Ihrer App abgerufen werden (wenn die Benutzer nicht direkt mit S3 verbunden sind), nicht einmal Bandbreitengebühren, sondern nur die Kosten für die Speicherung von 50 MB.

5voto

kEND Punkte 6629

Haben Sie versucht, .gitignore in Ihrem Zweig anders zu setzen?

Sie sollten in der Lage sein, das zu ignorieren, was Sie wollen, solange die Dateien nicht in diesem Zweig verfolgt werden.

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