Est-il possible de sélectionner une propagation à partir d'un autre dépôt git?

je travaille avec un dépôt git qui a besoin d'une propagation depuis un autre dépôt Git qui ne connaît rien du premier.

en général, je choisirais le HEAD@{x} dans le refrog, mais parce que ce .git ne sait rien de cette entrée de refrog (répertoire physique différent), Comment puis-je choisir ceci, ou Puis-je?

j'utilise git-svn . Ma première branche utilise git-svn du trunk d'une sous-version de repo, et la branche suivante utilise git-svn sur une branche Subversion.

550
demandé sur halfer 2011-02-25 19:47:41

10 réponses

vous devrez ajouter l'autre dépôt comme une télécommande, puis récupérer ses modifications. De là, vous voyez le commit et vous pouvez le choisir.

comme ça:

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

Maintenant vous avez toutes les informations pour simplement faire git cherry-pick .

pour en savoir plus sur les télécommandes, cliquez ici: https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes

382
répondu CharlesB 2017-10-24 11:10:39

la réponse, telle qu'elle est donnée, est d'utiliser format-patch mais puisque la question était comment choisir à partir d'un autre dossier, voici un morceau de code pour faire exactement cela:

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

(explication de @congma)

la commande git format-patch crée un patch à partir de some_other_repo 's commit spécifié par son SHA ( -1 pour un seul commit). Ce le patch est pipé à git am , qui applique le patch localement ( -3 essayer la fusion à trois si le patch ne s'applique pas proprement). Espérer qui explique.

747
répondu Robert Wahler 2017-09-21 19:24:20

Voici un exemple de la télécommande-fetch-fusion.

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

alors vous pouvez:

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

ou vous pouvez même fusionner l'ensemble de la branche

git merge projectB/master
122
répondu Brian 2018-08-30 11:53:52

Vous pouvez le faire, mais il nécessite deux étapes. Voici comment:

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

remplacer <remote-git-url> par l'url ou le chemin du dépôt à partir duquel vous voulez choisir.

remplacer <branch> par le nom de la branche ou de l'étiquette que vous souhaitez sélectionner dans le dépôt distant.

vous pouvez remplacer FETCH_HEAD par un git SHA de la branche.

mise à Jour le: modifié basé sur @pkalinow commentaires.

102
répondu docwhat 2014-09-13 01:25:48

Voici les étapes pour ajouter une télécommande, récupérer des branches, et choisir une commit

# Cloning our fork
$ git clone git@github.com: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

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

54
répondu jaredwilli 2015-10-16 15:59:14

Voir Comment créer et appliquer un patch avec Git . (D'après la formulation de votre question, j'ai supposé que cet autre dépôt est pour une base de code entièrement différente. Si c'est un dépôt pour la même base de code, vous devriez l'ajouter comme une télécommande comme suggéré par @CharlesB. Même si c'est pour une autre base de code, je suppose que vous pouvez toujours l'ajouter comme une télécommande, mais vous pourriez ne pas vouloir obtenir la branche entière dans votre dépôt...)

16
répondu Aasmund Eldhuset 2011-02-25 16:51:08

vous pouvez le faire dans une ligne comme suit. J'espère que vous êtes dans le dépôt git qui ont besoin de la modification choisie et vous avez vérifié pour corriger la branche.

git fetch ssh://git@stash.mycompany.com:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533

git fetch [direction URL] [Direction de cherry-pick de] && git cherry-pick [valider ID]

7
répondu Don 2015-09-17 09:47:50

Oui. Récupérez le dépôt puis sélectionnez-le dans la branche distante.

4
répondu wilhelmtell 2011-02-25 16:51:07

Ma situation était que j'ai un rapport nu que l'équipe pousse à, et un clone de cela assis juste à côté de lui. Cet ensemble de lignes dans un Makefile fonctionne correctement pour moi:

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

en tenant à jour le master of the bare repo, nous sommes en mesure de sélectionner un changement proposé publié dans le bare repo. Nous disposons également d'un moyen (plus compliqué) de sélectionner plusieurs braches pour un examen et des tests consolidés.

si " sait rien "signifie" ne peut pas être utilisé comme une télécommande", alors ça n'aide pas, mais cette question est venue alors que je googlais autour de trouver ce workflow alors j'ai pensé que je contribuerais en retour.

0
répondu Paul Hulett 2013-05-31 19:04:58

Assumer A est l'opération que vous voulez choisir de, et de B est celui que vous voulez choisir de, vous pouvez le faire en ajoutant </path/to/repo/A/>/.git/objects à </path/to/repo/B>/.git/objects/info/alternates . Créer ce fichier alternates s'il n'existe pas.

cela permettra à repo B d'accéder à tous les objets git de repo A, et fera fonctionner cherry-pick pour vous.

0
répondu pranavk 2016-04-08 19:14:24