git: haben unterschiedliche .gitignore-Dateien für jede Fernbedienung

75

Ich habe ein Remote-Repo, in dem ich bestimmte Dateien festschreiben möchte (die kompilierten Dateien, um sie auf einer Cloud-Computing-Plattform bereitzustellen), aber ich möchte sie nicht auf Github bereitstellen ...

Gibt es eine Möglichkeit, verschiedene Gitignore-Dateien zu verwenden, eine für jede Fernbedienung?

opensas
quelle
1
Hoppla, habe gerade diese Frage gefunden: stackoverflow.com/questions/2456533/…
öffnet
@opensas, ich bin durch Ihre Open-Shift-Bibliothek für Play 2 gekommen und bin über das gleiche Problem gestolpert, wie man ein normales Git-Repo für die Entwicklung (mit Ausnahme aller generierten Dateien) und eines explizit für die Bereitstellung (mit allen generierten Dateien) verwaltet. Haben Sie bisher eine gute Lösung gefunden?
Bachi
2
Bachi: Am Ende habe ich nur ein kleines Bach-Skript verwendet, das die while-App einfach in ein anderes Verzeichnis kopiert und von dort aus openshift_deploy ausführt. Das heißt, ich behalte zwei völlig unterschiedliche Git-Repos. Ich hätte es mit Zweigen und unterschiedlichen .gitignore für jeden Zweig tun können, aber ich denke, dieser Ansatz ist sauberer. Außerdem ist es einfacher, js-Dateien vor der Bereitstellung zu verarbeiten / zu minimieren
öffnet am
@opensas Es tut uns leid, hier ein unglaublich altes Thema anzusprechen, aber wie würden Sie vorgehen, um für jeden Zweig unterschiedliche .gitignore-Dateien zu haben? Ich versuche das selbst herauszufinden ...
Swivel

Antworten:

40

Dies ist in Git's Modell nicht wirklich sinnvoll. Commits enthalten Dateigruppen. Alle .gitignore-Dateien weisen die Benutzeroberfläche an, keine Dateien automatisch hinzuzufügen, die bestimmten Mustern entsprechen. Dies würde effektiv bedeuten, parallele Sätze von Commits zu haben, die fast gleich sind, aber nur eine Teilmenge der Dateien enthalten.

Dies wäre mit einem Verzweigungsschema möglich, bei dem Sie einen "Bereitstellungs" -Zweig haben, der sich vom Master abspaltet und derselbe ist, aber die zusätzlichen kompilierten Dateien enthält. Dies könnte sogar mit Git-Hooks automatisiert werden, um die Dateien automatisch zu kompilieren und dem Repo hinzuzufügen. Ich stelle mir eine Struktur wie diese vor:

master:       A ---> B ---> C ---> D
               \      \      \      \
                \      \      \      \
deployment:      -> A'  -> B'  -> C'  -> D'

Das heißt, jedes Mal, wenn ein bestimmter Server ein neues Commit für den Master erhält, erstellt er das Projekt, fügt die erstellten Dateien einem neuen Commit von D hinzu und schreibt dies an den Bereitstellungszweig fest - der dann nicht an Github übertragen werden muss.

djs
quelle
4
Gute Idee, ich habe nicht darüber nachgedacht, verschiedene Zweige zu verwenden, jeder mit seinem eigenen .gitignore
eröffnet
11

Ich finde einen Weg, dies zu tun.

In meinem Fall musste ich das Projekt mit Heroku und Github (als öffentliches Repo) synchronisieren.

Einige Dateien mit privaten Informationen waren jedoch nicht interessant, um in einem öffentlichen Repository freigegeben zu werden

Normalerweise hat ein einfaches Projekt die folgende Ordnerstruktur

Project folder (remote heroku)
    - .git
    - .gitignore
    - (folders and files)

Ich habe eine weitere Ebene hinzugefügt und darin ein weiteres Git-Repository mit einem Gitignore erstellt, der einige Dateien aus meinem Projekt weglässt.

Project public (remote github)
    - .git
    - .gitignore
    - Project folder (remote heroku)
        - .git
        - .gitignore
        - (folders and files)

Dies ist also kein Git-Repository mit zwei Remote-Repositorys mit unterschiedlichen Gitignores.

Es gibt zwei verschiedene Repositorys.

Im Innersten schließe ich nur die von der IDE generierten Dateien und einige zur Laufzeit generierte Dateien aus.

Auf der äußersten Ebene schließe ich alle Dateien aus, die nicht veröffentlicht werden können.

Guilherme
quelle
1

Eine weitere Option sind Git-Submodule .

Dies kann nützlich sein, wenn Sie beispielsweise möchten, dass sich Ihr Code und Ihre Dokumentation in zwei verschiedenen Repos mit unabhängiger Zugriffskontrolle usw. befinden. Sie haben also insgesamt 3 Repos, ein Submodul-Repo für Dokumente, ein anderes für Code und das " master "(kein Git-Submodul) Repo, das beides enthält (für den Pypi-Upload vielleicht). Dies ist eine gute Möglichkeit, ein CS-Lehrbuchprojekt zu organisieren. Beide Projekte können unabhängig voneinander fröhlich voranschreiten und bei Hauptversionen synchronisiert werden, gesteuert vom Master-Repo-Betreuer.

Kochfelder
quelle
1

Eine automatisierte Lösung für die hier genannten Methoden:

  1. Richten Sie die Root-Datei .git so ein, dass die Unterordner, die Sie übertragen möchten, ignoriert werden
  2. Initialisieren Sie einen neuen Git in den Unterordnern und weisen Sie die Remote-Konfiguration zu
  3. Ändern Sie die .git / hooks / pre-push-Datei des Stammordners, um git push in diesen Unterordnern basierend auf den eingehenden Argumenten auszuführen.
MKN Web Solutions
quelle
1
Am Ende habe ich das alleine gemacht. Wenn Sie wirklich Automatisierung wollten. Machen Sie diesen Ordner zu einem temporären Ordner und entfernen Sie ihn cd ..; rm -rf temp_folder;nach dem Drücken. github.com/MichaelDimmitt/publicize_readme/blob/master/… github.com/MichaelDimmitt/publicize_readme/blob/master/…
Michael Dimmitt