2017-01-21 2 views
1

Ich habe ein Monorepo-Projekt proj mit Unterbäumen in einem Ordner sub unter proj/sub. Ich habe Tonnen von Commits gemacht, die sowohl proj als auch sub berühren. Wie veröffentliche ich die relevanten Änderungen an Upstream sub effektiv?Git commits, die einen Unterbaum/Unterordner berühren

Normalerweise ich haben würde herauspicken jeder

git cherry-pick -x --strategy=subtree -Xsubtree=sub/ commit-ref

mit begehen, aber ich habe gemacht Myriaden von begeht so dass diese nicht durchführbar ist. Wie kann ich die Änderungen gleichzeitig in sub integrieren? Zum Beispiel, erstellen Sie eine große gequetschte Commit, die sub in den gleichen Zustand bringen würde, ist es in meinem Monorepo.

Verwandte: View commits that make changes to subfolder, How to cherry pick a range of commits and merge into another branch

+0

Da Ihre Arbeit viel Commits hat, glaube ich, dass Ihr Quellcode eine große Menge an Konflikt hat . Ich denke, Sie sollten ein externes Tool zum Vergleichen und Zusammenführen wie Beyond Compare 4 oder WinMerge verwenden, das mit IDE kombiniert wird. –

+1

Müssen Autoren und Kommentare der Commits aufbewahrt werden? – jbu

+0

@jbu wäre es schön, nicht gequetscht noch besser, wenn ein Commit sowohl proj und sub berührt, sollte es die Nachricht aber nur die relevanten Deltas beibehalten. Im Idealfall. – rfabbri

Antwort

2

Aktuelle Lösung: meist rebase

Ein paar Rebases mit ein paar cherrypicks tun wird, aber bisher habe ich nicht eine automatisierte Art und Weise mit einem einzigen Befehl gefunden. Verwenden Sie

git rebase -s subtree -Xsubtree=sub --onto sub_master proj_ini proj_end 

kopieren auf das Teilprojekt Master Zweig sub_master alle Toplevel proj Festschreibungen von ref proj_ini (exklusiv) ref proj_end (einschließlich). Die Branche, in der Sie sich befinden, spielt keine Rolle. Für jede begehen können diese Dinge auftreten:

  1. Verpflichtet, dass Touch nur sub das Teilprojekt nur kopiert werden sauber
  2. Verpflichtet, dass Touch-Dateien außerhalb sub wird nicht angezeigt. Da wir uns neu orientieren, werden diese stillschweigend ignoriert. Wenn Sie herauspicken diese Art zu begehen, wird ein Fehler zu sagen auftreten, dass leere Commits nicht erlaubt
  3. Commits (zukünftige Git Versionen git cherry-pick --skip-empty haben kann), die Änderungen an beiden sub und außerhalb haben werden kopiert mit genau die gleiche Nachricht, aber mit nur die relevanten Änderungen/Dateien gehalten, der Rest
  4. sauber ignoriert
  5. Benennt/bewegt proj-sub als Schöpfungen
  6. Merge Commits sauber neu geschrieben werden meist sauber berücksichtigt, mit einigen Ausnahmen

    5.1 Ignorieren Sie explizit das letzte Zusammenführungs-Commit, das Sie an dem proj-Master aus sub vorgenommen haben.

    5.2 verschmelzen Explizit bestimmte merge Festschreibungen, die Konfliktlösung beteiligt waren, unter Verwendung eines cherrypick (Stromzweig sub_master sein muss):

    git cherry-pick -x --strategy=subtree -Xsubtree=sub -m 2 merge_ref 
    

    wo -m ist in der Regel 1 oder 2 für jedes Elternteil.(In der Praxis werde ich blind versuchen, entweder ein und git cherry-pick --abort und versuchen, den anderen, wenn ich Konflikte oder unerwünschte Änderungen erhalten)

1

seit Kirsche-Pick in mehreren tatsächlich nehmen begehen-ishes, könnten Sie einfach git log [<options>] [<revision range>] -- sub tun und formatieren Sie die Ausgabe auf nur Hash-Summen drucken? Feed die Liste in git cherry-pick -x --strategy=subtree -Xsubtree=sub/ <list of commits>. Versuchen Sie nur, diese Aufgabe mit weniger Befehlen zu erledigen? Wenn ja, könnte es funktionieren, obwohl ich es nie persönlich gemacht habe.

+0

cherry wählen Sie einen Bereich war nicht so gut wie Rebasing hauptsächlich weil es wird derzeit fehlschlagen, wenn irgendwelche Commits in dem Bereich zu leeren Commits zu "sub" – rfabbri

+0

führen und ich mich nicht damit begnügen konnte, blind eine Liste von 'git log' aus einer hoch nichtlinearen Geschichte voller Merges in cherry-pick zu füttern – rfabbri