wake-up-neo.net

Ist es möglich, ein Commit aus einem anderen Git-Repository auszuwählen?

Ich arbeite mit einem Git-Repository, das ein Commit von einem anderen Git-Repository benötigt, das nichts von dem ersten weiß.

Normalerweise würde ich mit dem [email protected]{x} im Reflog eine Auswahl treffen, aber da dieser .git nichts über diesen Reflog-Eintrag (anderes physikalisches Verzeichnis) weiß, wie kann ich diese Auswahl treffen oder kann ich?

Ich benutze git-svn. Mein erster Zweig benutzt git-svn des trunk eines Subversion-Repos, und der nächste Zweig benutzt git-svn für einen Subversion-Zweig.

651
gitcoder182

Sie müssen das andere Repository als Remote hinzufügen und dann die Änderungen abrufen. Von dort aus sehen Sie das Commit und können es auswählen.

So wie das:

_git remote add other https://example.link/repository.git
git fetch other
_

Jetzt haben Sie alle Informationen, um einfach zu tun git cherry-pick .

Weitere Informationen zum Arbeiten mit Fernbedienungen finden Sie hier: https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes

479
CharlesB

Die Antwort lautet, wie angegeben, format-patch zu verwenden. Da jedoch die Frage lautete, wie aus einem anderen Ordner ausgewählt werden kann, ist hier ein Stück Code, um genau das zu tun:

$ git --git-dir=../<some_other_repo>/.git \
format-patch -k -1 --stdout <commit SHA> | \
git am -3 -k

(Erklärung von @ cong ma )

Der Befehl git format-patch erstellt einen Patch aus dem Commit von some_other_repo, der durch sein SHA (-1 nur für ein einzelnes Commit) angegeben wird. Dieser Patch wird an git am weitergeleitet, wodurch der Patch lokal angewendet wird (-3 bedeutet, dass die Drei-Wege-Zusammenführung versucht wird, wenn der Patch nicht ordnungsgemäß angewendet werden kann). Hoffe das erklärt.

816
Robert Wahler

Hier ist ein Beispiel für die Remote-Fetch-Merge.

cd /home/you/projectA
git remote add projectB /home/you/projectB
git fetch projectB

Dann kannst du:

git cherry-pick <first_commit>..<last_commit>

oder Sie könnten sogar die gesamte Branche zusammenführen

git merge projectB/master
138
Brian

Sie können es tun, aber es sind zwei Schritte erforderlich. Hier ist wie:

git fetch <remote-git-url> <branch> && git cherry-pick FETCH_HEAD

Ersetzen Sie <remote-git-url> durch die URL oder den Pfad zu dem Repository, aus dem Sie eine Auswahl treffen möchten.

Ersetzen Sie <branch> durch den Zweig- oder Tagnamen, den Sie aus dem Remote-Repository auswählen möchten.

Sie können FETCH_HEAD durch ein Git SHA aus dem Zweig ersetzen.

Aktualisiert: Geändert basierend auf @ pkalinows Feedback.

116
docwhat

Hier sind die Schritte zum Hinzufügen einer Remote-Instanz, zum Abrufen von Zweigen und zum Auswählen eines Commits

# Cloning our fork
$ git clone [email protected]:ifad/rest-client.git

# Adding (as "endel") the repo from we want to cherry-pick
$ git remote add endel git://github.com/endel/rest-client.git

# Fetch their branches
$ git fetch endel

# List their commits
$ git log endel/master

# Cherry-pick the commit we need
$ git cherry-pick 97fedac

Quelle: https://coderwall.com/p/sgpksw

58
jaredwilli

Siehe Erstellen und Anwenden eines Patches mit Git . (Nach dem Wortlaut Ihrer Frage bin ich davon ausgegangen, dass sich dieses andere Repository auf eine völlig andere Codebasis bezieht. Wenn es sich um ein Repository für dieselbe Codebasis handelt, sollten Sie es wie von @CharlesB vorgeschlagen als Remote hinzufügen. Auch wenn es sich um ein anderes Repository handelt Code-Basis, ich denke, Sie könnten es immer noch als Remote hinzufügen, aber Sie möchten vielleicht nicht den gesamten Zweig in Ihr Repository bekommen ...)

17

Sie können dies wie folgt in einer Zeile tun. Ich hoffe, Sie befinden sich im Git-Repository, das die von Kirschen gepflückte Änderung benötigt, und Sie haben den korrekten Zweig ausgecheckt.

git fetch ssh://[email protected]:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533
# 

git fetch [branch URL][Branch to cherry-pick from] && git cherry-pick [commit ID]

10
Don

Ja. Holen Sie sich das Repository und wählen Sie es dann aus dem Remote-Zweig aus.

5
wilhelmtell

Angenommen, A ist das Repo, aus dem Sie eine Kirsche auswählen möchten, und B ist das, aus dem Sie eine Kirsche auswählen möchten, können Sie dies tun, indem Sie </path/to/repo/A/>/.git/objects zu </path/to/repo/B>/.git/objects/info/alternates hinzufügen. Erstellen Sie diese alternates Dateien, falls sie nicht existieren.

Dadurch kann Repo B auf alle Git-Objekte von Repo A zugreifen und Cherry-Pick für Sie ausführen.

1
pranavk

Meine Situation war, dass ich ein nacktes Repo habe, auf das das Team drängt, und einen Klon davon, der direkt daneben sitzt. Diese Zeilen in einem Makefile funktionieren für mich korrekt:

git reset --hard
git remote update --Prune
git pull --rebase --all
git cherry-pick -n remotes/Origin/$(BRANCH)

Indem wir den Master des Bare Repo auf dem neuesten Stand halten, können wir eine vorgeschlagene Änderung auswählen, die für das Bare Repo veröffentlicht wurde. Wir haben auch eine (kompliziertere) Möglichkeit, mehrere Braches für eine konsolidierte Überprüfung und Prüfung auszuwählen.

Wenn "Weiß nichts" bedeutet "Kann nicht als Fernbedienung verwendet werden", hilft dies nicht. Diese SO Frage wurde jedoch gestellt, als ich herumgegoogelt habe, um diesen Workflow zu entwickeln. d tragen zurück bei.

0
Paul Hulett