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

4voto

1. Zusammenfassung

  1. Utilizo Travis CI für Einsatz von ( es unterstützt die Heroku-Bereitstellung )
  2. Ich füge zu meinem .travis.yml :

    before_deploy:
    - mv misc/.gitignore .gitignore

    Wo misc - ein beliebiger Ordner, enthält eine andere .gitignore .

    mv UNIX-Befehl Datei verschieben; überschreiben, wenn die Datei bereits existiert.

Wenn Travis CI ein Projekt bereitstellt, wird Travis CI nicht auf bereitstellender Anbieter Dateien und Ordnern, die in misc/.gitignore (nicht im Original .gitignore von Quellen).


2. Beschränkungen

  1. Diese Antwort ist möglicherweise nicht für alle Bedingungen des Autors geeignet. Aber diese Antwort beantwortet die Frage "Wie kann ich mit Git eine Datei in einem Zweig ignorieren, sie aber in einen anderen Zweig übertragen lassen?"
  2. Ich bin kein Heroku-Benutzer, meine Beispiele für GitHub , nicht für Heroku. Daten dieser Antwort funktioniert für mich in GitHub, aber möglicherweise nicht auf Heroku arbeiten.

3. Relevanz

Diese Antwort ist für April 2018 relevant. In Zukunft können die Daten dieser Antwort veraltet sein.


4. Vorführung

meine echtes Projekt .

Beispiel für einen erfolgreichen Einsatz .

4.1. Aufgabe

Ich stelle mein Projekt vom src-Zweig in den dest-Zweig des gleichen Repositorys bereit.

Ich möchte, dass diese Datei PaletteMira.suricate-profile :

  • Lokaler Rechner - existiert für alle Zweigstellen,
  • src remote branch - nicht vorhanden,
  • dest remote branch - existiert.

Wenn ich den Verfasser der Frage richtig verstanden habe, hat er eine ähnliche Aufgabe.

4.2. src

Quellenbranche - SashaYAML .

Teil von .travis.yml :

before_deploy:
- mv misc/.gitignore .gitignore

deploy:
  provider: pages
  on:
    branch: SashaYAML
  keep-history: true
  skip-cleanup: true
  target-branch: SashaDevelop
  repo: Kristinita/PaletteMira
  github-token: $GITHUB_TOKEN
  committer-from-gh: true
  project-name: PaletteMira
verbose: true

Teil von .gitignore :

*.sublime-snippet
*.suricate-profile

Teil von misc/.gitignore

*.sublime-snippet

*.suricate-profile nicht in misc/.gitignore .

PaletteMira.suricate-profile in diesem Zweig nicht entfernt, sondern nur lokal vorhanden ist.

4.3. dest

Zielfiliale - SashaDevelop

Teil von .gitignore :

*.sublime-snippet

*.suricate-profile nicht in misc/.gitignore .

PaletteMira.suricate-profile für diesen Zweig existiert per Fernzugriff und vor Ort.

4.4. Schritte zur Reproduktion

Ich aktiviere das PaletteMira GitHub Repository für Travis CI I Umgebungsvariable setzen $GITHUB_TOKEN mit Wert - mein GitHub-Token Ich mache jede Übergabe an meinen src-Zweig.

Wenn keine Fehler auftreten, muss ich erwartetes Verhalten .

1voto

Flo Ragossnig Punkte 1222

Die ursprüngliche Frage ist ein wenig ungewöhnlich, aber ich bin darauf gestoßen, weil ich gerade einen Artikel geschrieben habe. mittlerer Artikel Ich dachte, dies könnte jemandem helfen.

Ich persönlich habe das Problem gelöst mit Git-Haken über Husky - scheint die die einfachste und zuverlässigste Lösung.

Natürlich empfehle ich, den Artikel zu lesen, aber hier sind die Schritte zur Reproduktion

  • Schritt 1: yarn add -D husky && yarn husky install
  • Schritt 2: yarn husky add .husky/post-checkout
  • Schritt 3: mkdir .husky/gitignores && cp .gitignore .husky/gitignores
  • Schritt 4: touch .husky/gitignores/.gitignore_husky
  • Schritt 5: Kopieren und Einfügen diese Kernaussage en .husky/post-checkout

0voto

Tom Punkte 32504

Kann man von Heroku aus committen und pushen?

Fügen Sie z. B. das Audio hinzu, pushen Sie es auf Github und in Heroku, entfernen Sie die Dateien aus der Arbeitskopie auf Heroku. Entfernen Sie die Audiodateien aus dem Repo, aber nicht von der Festplatte, und pushen Sie diese Änderung dann zurück auf Github.

0voto

John Lozano Punkte 115

Github hat jetzt Unterstützung für Large file storage, mehr dazu hier https://git-lfs.github.com/

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