2016-06-22 15 views
0

Ich habe ein Problem, einige Commit von zwei Projekten zu verschieben, die Details: - Projekt 1: Haben Sie einen einzigen Git, der viele Verzeichnisse - Project 2: Have die gleichen Verzeichnisse von Projekt 1, aber für jedes Verzeichnis gibt es einen getrennten Git. Die Frage ist: ich habe eine Festschreibung in einem Projekt, das Dateien in zwei Verzeichnissen und Plus berühren, und ich möchte cherry-pick, die verpflichten und jede Änderung jeder Datei bewegen und sich verpflichten, ihnen 2.Cherry-Pick Commit von einem einzelnen Git zu mehreren Git

Dank Projekt ahead

Antwort

0

Ein Cherry-Pick erfasst den gesamten Commit und wendet den gesamten Commit auf den aktuellen Zweig an. Wie ich Ihre Frage verstehe, wollen Sie commits nehmen, die Änderungen an mehreren Verzeichnissen vornehmen, und nur die Änderungen eines einzelnen Verzeichnisses bei jedem Commit in ein separates git-Repository aufnehmen, das nur dieses Verzeichnis enthält.

Da ein Cherry-Pick, wie ich schon sagte, den gesamten Commit ergreift, wird es nicht so, allein funktionieren.

Es sollte jedoch möglich sein, Kirschbaum zusammen mit Filterzweig zu verwenden, um dies zu erreichen.

Das erste, was zu tun ist, ist eine neue Arbeitszweig in Project 1 zu überprüfen, um keine der vorhandenen Zweige zu versauen. Ihr Arbeitszweig wird ein brennendes Wrack sein, am Ende von diesem, an welchem ​​Punkt Sie es ruhig loswerden können; kein Schaden, kein Foul.

Einmal im neuen Arbeitszweig, verwenden Sie git filter-branch --tree-filter, um die Commits neu zu schreiben und löschen Sie alles in der Struktur außer einem der betreffenden Verzeichnisse (Sie müssen die Umschreibung von den Eltern der commit/commits, die Sie wünschen zu migrieren, anstatt das commit/commit selbst).

An diesem Punkt werden die neugeschriebenen Commits nur die Dateien in einem einzigen Verzeichnis in Project 1 berühren (Sie enden auch mit allen anderen Verzeichnissen völlig weggeblasen, in Ihrem Arbeitszweig, aber wen interessierts). Das übergeordnete Commit umfasst das Entfernen aller anderen Verzeichnisse im Arbeitszweig, und alle folgenden Commits sind auf Änderungen im verbleibenden Verzeichnis beschränkt. An diesem Punkt sollten Sie in der Lage sein, diese Commits in das entsprechende Git-Repository für Projekt 2 zu übernehmen.

Auflösen, spülen und für jedes Verzeichnis, das Sie migrieren möchten, wiederholen.

+0

Vielen Dank Sam für Ihre Antwort, ich teste es, aber ich arbeitete nie mit git filter-branch --tree-filter, ich habe ein Beispiel und sagen Sie Ihre Lösung: - In Projekt 1: Ich habe commit b0cefe4de84, dass Änderungen in: - Frameworks/base/LockPatternUtils.java - packages/apps/Einstellungen/security_finger_picker.xml - packages/apps/mms/SecuritySettings.java - in Projekt 2: ich habe Thesen git: - (Frameworks-Base) Frameworks/Basis - (Pakete-Apps-Einstellungen) Pakete/Anwendungen/Einstellungen/ - (Pakete-Apps-Mms) Pakete/Anwendungen/Mms – Optimmus

+0

Nun, jetzt ist Ihre Gelegenheit zu lernen, wie Sie Zweige zu filtern . Sie sollten viele Informationen in git's Dokumentation und Google-Suchen finden. Stackoverflow ist keine Tutorial-Site. Selbst wenn dies der Fall wäre, ist ein Kommentar mit 400 Zeichen für kein Tutorial ausreichend. –

+0

Vielen Dank für Ihre Antwort, effektiv haben Sie Recht, ich habe bereits nach Informationen in git gesucht, und ich habe diese Befehlszeile: git filter-branch --tree-filter 'rm -r! (Frameworks/base)' b0cefe4de84^..HEAD wo bleiben Rahmen/Basis und löschen Sie die restlichen Dateien in der Festschreibung, aber Sie wollen, ich habe Fehler git-filter-branch: 1: eval: Syntaxfehler: "(" Unerwartete sowieso, warum Sie "starten möchten Umschreiben von den Eltern der Commits/Commits, die Sie migrieren möchten, statt der Commit/Commits selbst). " ? – Optimmus