web-dev-qa-db-fra.com

Est-il possible de sélectionner un commit avec un autre dépôt git?

Je travaille avec un référentiel git nécessitant un commit provenant d'un autre référentiel git ignorant le premier.

En règle générale, je choisirais le type de recherche en utilisant le HEAD@{x} dans le compte-rendu, mais parce que ce .git ne sait rien de cette entrée de compte-rendu (répertoire physique différent), comment puis-je choisir ce résultat, ou puis-je?

J'utilise git-svn. Ma première branche utilise git-svn de la trunk d'un dépôt Subversion, et la branche suivante utilise git-svn sur une branche Subversion.

651
gitcoder182

Vous devrez ajouter l'autre référentiel en tant que télécommande, puis récupérer ses modifications. De là, vous voyez le commit et vous pouvez le sélectionner.

Comme ça:

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

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

Plus d'informations sur l'utilisation des télécommandes ici: https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes

479
CharlesB

La réponse, telle qu’elle est donnée, est d’utiliser format-patch, mais comme la question était de savoir comment sélectionner un fichier dans un autre dossier, voici un morceau de code permettant de le faire:

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

(explication de @ cong ma )

La commande git format-patch crée un patch à partir de la validation de some_other_repo spécifiée par son SHA (-1 pour une seule validation seule). Ce correctif est redirigé vers git am, qui l'applique localement (-3 signifie qu'il faut essayer la fusion à trois si le correctif ne s'applique pas correctement). J'espère que ça explique.

816
Robert Wahler

Voici un exemple de la récupération à distance.

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

Ensuite vous pouvez:

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

ou vous pouvez même fusionner toute la branche

git merge projectB/master
138
Brian

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

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

Remplacez <remote-git-url> par l'URL ou le chemin d'accès au référentiel dans lequel vous souhaitez effectuer une sélection.

Remplacez <branch> par le nom de branche ou de balise que vous souhaitez sélectionner dans le référentiel distant.

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

Mise à jour: modifiée en fonction des commentaires de @ pkalinow.

116
docwhat

Voici les étapes à suivre pour ajouter une télécommande, récupérer des branches et sélectionner un commit

# 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

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

58
jaredwilli

Voir Comment créer et appliquer un patch avec Git . (D'après le libellé de votre question, j'ai supposé que cet autre référentiel est destiné à une base de code totalement différente. S'il s'agit d'un référentiel pour la même base de code, vous devez l'ajouter en tant que télécommande, comme suggéré par @CharlesB. Même s'il s'agit d'un autre base de code, je suppose que vous pouvez toujours l’ajouter en tant que télécommande, mais vous ne voudrez peut-être pas que toute la branche soit dans votre référentiel ...)

17
Aasmund Eldhuset

Vous pouvez le faire en une ligne comme suit. J'espère que vous êtes dans le référentiel git qui a besoin du changement choisi et que vous avez vérifié pour corriger la branche.

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

git fetch [adresse URL de la branche] [branchez un sélecteur dans le choix de] && git cherry-pick [commit ID]

10
Don

Oui. Récupérez le référentiel, puis sélectionnez-le dans la branche distante.

5
wilhelmtell

En supposant que A soit le référentiel dans lequel vous voulez sélectionner, et que B soit celui que vous souhaitez sélectionner, vous pouvez le faire en ajoutant </path/to/repo/A/>/.git/objects à </path/to/repo/B>/.git/objects/info/alternates. Créez ces fichiers alternates s'il n'existe pas.

Cela fera en sorte que repo B accède à tous les objets git à partir de repo A, et fera que le tri sélectif fonctionne pour vous.

1
pranavk

Ma situation était que j'avais un compte-rendu simple sur lequel l'équipe pousse, et un clone de cette séance juste à côté. 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 gardant le maître de la mise à jour nue à jour, nous sommes en mesure de sélectionner un changement proposé publié dans la mise à jour nue. Nous avons également un moyen (plus compliqué) de sélectionner plusieurs branches pour des analyses et des tests consolidés.

Si "ne sait rien" signifie "ne peut pas être utilisé comme télécommande", cela n'aide pas, mais cette question SO est apparue alors que je cherchais avec joie pour trouver ce flux de travail, alors j'ai pensé Je contribuerais en retour.

0
Paul Hulett