Je dois effectuer une fusion de sous-arborescence pour une branche spécifique, si elle existe sur un référentiel distant donné. Le problème est que le référentiel distant n'est pas extrait localement, donc je ne peux pas l'utiliser git branch -r
. Tout ce que j'ai, c'est une adresse distante, quelque chose comme ça https://github.com/project-name/project-name.git
. Existe-t-il un moyen de répertorier les succursales distantes uniquement par une adresse distante? Je n'ai rien trouvé d'utile :(
106
git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null
suivi deif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
/refs/heads/branch-name
. Sinon, la branchefoo/branch-name
serait retournée même s'il n'y a pasbranch-name
.git ls-remote --heads origin branch-name
la source
git ls-remote --exit-code . origin/branch-name &> /dev/null
puis utilisé$?
comme opérande de testif git ls-remote ...; then ...; fi
, est moins sujet aux erreurs que la vérification$?
(qui peut être modifiée en enregistrant des instructions, des interruptions, etc.).--heads
?--heads
répertorie uniquement les branches. utiliser--tags
pour lister uniquement les balises.Une autre façon que vous pouvez utiliser dans le dossier actuel s'il s'agit d'un dépôt git à exécuter
la source
git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
git branch -a | grep "\b${BRANCH}$"
git fetch
est requis si vous utilisezgit branch -a
pour que toutes les références des télécommandes soient récupérées en premier. Sinon, utilisezgit ls-remote
comme indiqué par d'autres.git branch -a --list '<pattern>'
est également une option. Dirigez vers grep si vous avez besoin d'un code de retour pour votre script.Vous pouvez également utiliser ceci:
renvoie le dernier commit et la valeur de $? vaut 0 sinon renvoie "fatal: bad sha1 reference remotes / origin / <>" et la valeur de $? est 128
la source
Vous pouvez faire quelque chose comme ça dans le terminal Bash. Remplacez simplement les échos par les commandes que vous souhaitez exécuter.
J'espère que ça aide.
la source
Alors inutile de passer manuellement le nom du référentiel à chaque fois.
Au lieu de
Exemple :
OU
Les deux donneront le même résultat:
Plus d'informations sur Origin : Git a le concept de "télécommandes", qui sont simplement des URL vers d'autres copies de votre référentiel. Lorsque vous clonez un autre dépôt, Git crée automatiquement une télécommande nommée "origin" et pointe vers elle. Vous pouvez voir plus d'informations sur la télécommande en tapant git remote show origin.
la source
Toutes les réponses ici sont spécifiques au shell Linux, ce qui n'aide pas beaucoup si vous êtes dans un environnement qui ne prend pas en charge ce type d'opérations - par exemple, l'invite de commande de Windows.
git ls-remote
Accepte heureusement un--exit-code
argument qui renvoie 0 ou 2 selon que la branche existe ou non, respectivement. Alors:git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>
renverra 0, et
git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>
retournera 2.
Pour PowerShell, vous pouvez simplement utiliser la sémantique intégrée de gestion de la vérité:
if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }
donne
$true
, tandis que:if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }
rendements
$false
.la source
Fonctionne la plupart du temps.
Mais ne fonctionnera pas si la branche correspond partiellement comme ci-dessous,
Utilisation
si vous voulez un moyen fiable.
Si vous souhaitez utiliser dans le script et ne voulez pas assumer
origin
comme télécommande par défaut, alorsdevrait marcher.
Notez que ce
git branch -a | grep ...
n'est pas fiable car il peutfetch
s'écouler un certain temps depuis la dernière exécution.la source
grep -x "$branch"
est identique àgrep ^"$branch"$
). Bien que dans les scripts que je préfère la forme longue passe:--line-regexp
. En outre, il n'est pas nécessaire de le fairewc -l
. Mettre une sortie vide dans un Bash estif [ -z ]
effectivement évalué comme vrai, ce qui signifie que la branche n'existe pas. Cela vous fait gagner quelques millisecondes.Vous pouvez ajouter le référentiel que vous avez en tant que télécommande à l'aide
git remote add something https://github.com/project-name/project-name.git
, puis effectuer ungit remote show something
pour obtenir toutes les informations sur la télécommande. Cela nécessite une connexion réseau et est utile pour un usage humain.Sinon, faites un
git fetch something
. Cela récupérera toutes les branches de la télécommande appeléesomething
et les conservera dans votre référentiel local. Vous pouvez ensuite les fusionner dans votre succursale locale à votre guise. Je recommande ce chemin car si vous décidez enfin que vous devez fusionner, c'est ce que vous devez faire.OT: Votre utilisation de «extrait localement» indique que vous abordez cela du point de vue d'un système de contrôle de version centralisé. C'est généralement une impasse lorsque vous avez affaire à git. Il utilise des mots comme «checkout», etc. différemment de la façon dont les anciens systèmes le faisaient.
la source
Tu peux essayer
Ici se
@{u}
réfère à remote / upstream, et se@{0}
réfère à HEAD local actuel (avec une version plus récente de git,@{0}
peut être raccourci comme@
). Si la télécommande n'existe pas, il se trompe.Avec git 2.16.2 (je ne sais pas quelle version est la première à avoir cette fonctionnalité, par exemple, git 1.7.1 ne l'a pas), vous pouvez faire
Si une branche distante existe, il y aura une sortie, comme
Sinon, il n'y a pas de sortie.
la source
Renvoie toutes les branches (distantes ou locales) qui contiennent la requête dans le nom.
git branch --all | grep <query>
la source
Si vos noms de branche sont très spécifiques, vous n'aurez peut-être pas besoin d'utiliser grep pour une simple correspondance de nom de branche:
qui fonctionne pour
Nous utilisons un identifiant de problème unique comme noms de branche et cela fonctionne très bien.
la source
J'ai juste essayé ceci:
Cela renverra 1 si la branche "your-branch" est trouvée et 0 sinon.
la source
Je combine certaines des réponses ci-dessus dans un script:
Ce script obtiendra 4 branches à partir d'un bitbucket distant, et les poussera vers un github distant, puis poussera toutes les balises vers github. J'utilise ceci dans un travail Jenkins, c'est pourquoi vous n'en voyez pas
git fetch
ougit pull
, c'est déjà fait dans la configuration du référentiel de travaux Jenkins.Je préfère généralement les options longues dans les scripts. J'aurais pu combiner
git branch
etgit checkout
en utilisantgit checkout -B
.la source