Mit git subtree Verschmelzung, aber auch in allen Zweigen aller fusionierenden Teilbäume zusammen

StackOverflow https://stackoverflow.com/questions/2137950

  •  22-09-2019
  •  | 
  •  

Frage

Ich mag einen beliebten Open-Source-Issue-Tracker verwenden (Redmine), dass Angebote Integration git. Leider kann jedes Projekt in den Tracker mit nur einem git Repo zugeordnet werden. mehr Projekte in dem Tracker zu schaffen, ist nicht mein Ideal-Setup.

Mit dem im Verstand, ich habe versucht git Unterstruktur zu verwenden Verschmelzung (erklärt hier und hier ). Ich habe eine „Dach“ Repo geschaffen, die in jedem der zahlreichen anderen repos verschmolzen hat, dass ich arbeite mit.

Leider angeführten Beispiele nur Pull im Master-Zweig jeden Teilbaums. Da ich die Entwicklung auf in mehrere Zweige jeder Unterbaum gehen haben, muss ich lernen, wie man dieses Dach haben Repo jeden Zweig jedes Teilstruktur widerspiegeln.

Ist das möglich?

Extras Credit: Was passiert, wenn zwei Teilbäume haben jeweils einen Zweig mit dem gleichen Namen

War es hilfreich?

Lösung

Für die von uns nicht vertraut mit Redmine, bitte erweitern Beschreibung auf die folgenden Fragen umfassen Antworten: Welche Art von Zugang in das Repository hat den Tracker Bedarf? Wird es braucht seine eigene Commits zu machen? Oder braucht es nur bestimmte Arten von Lesezugriff (vielleicht zu validieren begehen Hashes und Scan-Commit-Protokolle für Keywords)?

Wenn Ihr Tracker nur Lesezugriff benötigt, können Sie keine Unterstruktur überhaupt Verschmelzung müssen. Es ist durchaus akzeptabel mehrere anfänglichen Commits (so dass mehrere, voneinander unabhängige Geschichten) in einem einzigen Repository zu haben. Das Git Projekt selbst tut dies für einige 'Extras' ( man html todo ) der Anteil nicht (Commit) Geschichte, sondern sind veröffentlicht neben dem Hauptsatz von Zweigen für den Quellcode ( maint Master weiter pu ). Für Ihren Zweck kann es genug, um eingerichtet werden eine Fernbedienung für jeden Unter Repository und deren Zweigspitzen in die Aggregation Repository holen. Vielleicht wäre genug, um der automatische ‚Remote-Tracking-Zweig‘, oder vielleicht benötigen Sie den zusätzlichen Schritt tun zu erstellen (und Aktualisierung) lokale Niederlassungen auf dem Basis des Remote-Tracking-Zweig.

Das Teilbaum Verschmelzen Schema, das Sie beschreiben, ist wahrscheinlich nicht sinnvoll, in der allgemeinen Situation, in der die Zweige in dem Quell-Repositories sind nicht verwandt oder nur halb bezogen. Aber, wenn alle Quell-Repositories eine Reihe von Niederlassungen teilen, wobei jeder Zweig einen bestimmten Zweck hat, die gleich in allen Repositories ist, könnten Sie wahrscheinlich sinnvoll verschmelzen sie zu einer Art Super-Repository.

Aber die interessante Frage ist nicht „was ist, wenn zwei Repositories Zweige mit dem gleichen Namen?“, Sondern „Wie beurteilen Sie den Fall behandeln, wo ein Repository einen Zweig aus dem gemeinsamen fehlt,‚global‘gesetzt?“.

Wenn alle Unter Repositories den gleichen Satz von Zweigen haben, tun Sie genau das, was Sie getan haben mit Master , aber einmal für jeden Zweig. Das Problem kommt, wenn ein bestimmte Zweig von einem Repository fehlt. Sie könnten ihre Master ersetzen , aber das kann nicht immer die richtige Antwort sein. Es hängt davon ab, warum Sie die Repositorys zusammen in erster Linie werden aggregiert und was Sie erwarten zu ‚sehen‘ in diesem Teilbaum dieses Zweiges in der Super-Repository.

Wenn die Unter Repositories sind nicht eng verwandt, dann wirklich ich habe meine Zweifel an der Angemessenheit dieses Teilbaums Ansatz. Ein solcher Ansatz für unabhängigen Repositorys fühlt sich an wie es gegen den Strich gehen "wäre. Es ist wahrscheinlich immer noch möglich, aber ich bezweifle, dass es jedes Werkzeug zu Hilfe, und Sie müssen einige Zeitplanung aus den Eckfällen verbringen.

Wenn Sie mit Teilstruktur verschmilzt am Ende kleben, können Sie bei der dritten Partei aussehen git subtree Befehl. Es könnte helfen, Ihre unzähligen Repositories synchronisiert zu halten.


Sammel Zweige, ohne zu verschmelzen

Wenn Redmine gibt an --mirror Klon, die Implikation ist, dass es lokale Niederlassungen und kann nicht in der Lage, direkt lesen Sie die ‚Remote-Tracking Braches‘ erwartet, so dass Sie wahrscheinlich einige lokale Zweige erstellen und aktualisieren müssen.

Lokale Niederlassungen aktualisiert Von ‚Remote-Tracking-Zweig‘
  • Grundeinstellung

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO &&
    git init
    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
        git config --add remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.heads.tags.;s.remotes.tags/all.')"
        git config remote.$r.tagopt --no-tags
    done
    
  • Periodic-Update

    git remote update
    git for-each-ref --shell --format \
      'git branch --force --track -l all/%(refname:short) %(refname:short)' refs/remotes \
      | sh
    
Lokale Branchen, die direkt Receive Fetched Astspitzen
  • Grundeinstellung

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO &&
    git init
    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
        git config remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.remotes.heads/all.')"
        git config --add remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.heads.tags.g')"
        git config remote.$r.tagopt --no-tags
    done
    
  • Periodic-Update

    git remote update
    

Beide Methoden am Ende Zweige unter refs/heads/all/<remote-name>/<branch-name-on-remote> sammeln, aber der erste hat auch einen doppelten Satz von Refs unter refs/remotes/<remote-name>/<branch-name-on-remote>. Die erste verwendet eine normale Abruf Refspec und Verwendungen git branch die ‚Fernverfolgungszweige‘ (refs/remotes/…) in die normale, lokale Zweige (refs/heads/all/…) zu duplizieren. Der zweite verwendet eine benutzerdefinierte Refspecdie abgerufenen refs direkt in der Zielhierarchie Ref zu speichern.

Aufgrund der Art und Weise Updates blind geholt in dieser kombinierten Repository sind, sollte niemand versuchen, direkt, es zu benutzen: keine Commits die direkt auf seinen Zweigen, keine Schübe von außen. Wenn jemand Commits lokal oder Push auf einen der Zweige diese Commits abgewischt werden würde machen, wann das nächste Update durchgeführt wird.

Wenn Redmine einen nackten Repository umgehen können, würde ich empfehlen, ein verwenden. Verwenden git init --bare und ein Repo-Name, das Enden mit .git. Auch git config core.logAllRefUpdates true könnte eine gute Idee sein (da diese standardmäßig auf false in einem kahlen Repository).

Neben dem all/ Präfix in dem Namensraum, ein weiterer Unterschied zwischen diesem Ansatz und einem vollen --mirror Klon ist, dass Refs außerhalb refs/heads und refs/tags werden nicht erhoben. Die meisten anderen gemeinsamen Refs sind ‚lokal‘ betrachtet in einem Repository (weshalb sie von einem normalen Klon nicht kopiert werden). Einige der anderen Refs sind ‚Remote-Tracking-Zweige‘ (refs/remotes), einige ‚bisect‘ Aufzeichnungen (refs/bisect), git filter-branch ‚original‘ ref Sicherungen (refs/original), et cetera. Wahrscheinlich keines dieser anderen Dinge sind wichtig für Redmine. Wenn sie sind, können sie auch mit zusätzlichen refspecs aufgenommen werden.

Erstellen von Zusatz Initial Commits

Um einen Zweig arrangiert mit einem neuen Anfang begehen, finden Sie unter GitTips unter Wie eine Niederlassung zu schaffen, die keine Vorfahren hat. Zwei der Rezepte beinhalten ein anderes Repository, von dem Sie drücken oder einen Zweig holen, nachdem sie durch die übliche init / add gehen / commit Schritt (genau das, was die oben genannten Rezepte in einer automatisierten Art und Weise tun).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top