J'ai créé un référentiel nu pour publier mon référentiel, mais je ne peux pas comprendre comment mettre à jour le référentiel nu avec l'état actuel du référentiel principal.
Quand j'ai fait un git-fetch --allà l'intérieur du référentiel nu, je n'ai pas vu les mises à jour que j'avais apportées au référentiel principal, mais lorsque git push --all <url-of-bare-repo>je les ai poussées à partir du référentiel principal avec, je vois les mises à jour dans git log. Il y a probablement une explication simple à cela - quelqu'un peut-il expliquer?
pho79
2
@Thomas - Ouais, par "n'a pas vu" je veux dire git logne montre pas ces mises à jour dans le dépôt nu. (Ni l'un ni l'autre git log --all, et pas plus qu'un dépôt fonctionnel créé en clonant le dépôt nu - soit via git log --allou simplement en regardant de nouveaux fichiers qui devraient apparaître là-haut). C'est un test assez rapide à voir par vous-même. La plupart du temps, je suis juste curieux de ce que je manque.
pho79
71
Si votre dépôt le plus distant est quelque chose comme github, où vous n'avez pas accès, ne pouvez pas exécuter push, etc., vous pouvez le faire git fetch -q origin master:masterdans votre dépôt nu local. Cela récupérera les nouveaux éléments de la branche principale de github et mettra à jour votre branche principale locale.
Altreus
4
@Altreus Indeed master:masterest ce qu'il faut pour faire avancer HEAD vers celui du repo distant. Dans mon cas, à cause d'un problème, je ne pouvais plus me connecter à notre dépôt nu car git manquait. Jusqu'à ce que cela soit résolu, je fais un tunnel inverse et je vais au repo central en utilisant: git fetch ssh://localhost:8765/... master:masteret cela fonctionne comme un charme. Merci!
estani
3
@Altreus Si vous voulez toutes les branches, vous pouvez le fairegit fetch origin *:*
JBert
71
J'ai créé un référentiel à l'aide de la commande suivante
git clone --bare <remote_repo>
Ensuite, j'ai essayé de mettre à jour le clone nu en utilisant la réponse de Thomas, mais cela n'a pas fonctionné pour moi. Pour mettre à jour le référentiel nu (ce que je pense que Let_Me_Be demandait), j'ai dû créer un référentiel miroir:
git clone --mirror <remote_repo>
Ensuite, je pourrais exécuter la commande suivante dans le référentiel en miroir pour récupérer les mises à jour du référentiel principal:
Pour changer un dépôt nu existant en miroir, tout ce que vous avez à faire est d'ajouter 2 lignes au fichier de configuration git à <REPO> .git / config. Dans la [remote "origin"]section, ajoutez fetch = +refs/*:refs/*etmirror = true
Isaac Betesh
@IsaacBetesh Vous avez sauvé ma journée :)
smc
54
La seule solution en plus de recréer avec git clone --mirrorest de Gregor :
alors vous pouvez git fetchet vous verrez les mises à jour. La chose étrange est qu'avant cela, même s'il y a un remoteconfiguré, il n'a pas de branches répertoriées dans git branch -a.
Cela m'a vraiment aidé! Le projet / dépôt Capistrano utilise également ce paramètre pour permettre à une seule ligne git remote updatede faire le travail.
Minqi Pan
1
Si la télécommande a des branches mises à jour ou supprimées de force (et que vous souhaitez refléter ces modifications), vous devrez peut-être ajouter respectivement --forceet --pruneà la git fetchligne.
Bien que je ne sache pas quand cela se produit, s'il originn'est pas défini, vous pouvez toujours remplacer la originpièce par le chemin / l'URL de votre référentiel d'origine. par exemple$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak
Ceci est exactement ce que je cherchais. Cela a parfaitement fonctionné.
Maxime Rouiller
13
Après beaucoup de déconner, j'ai trouvé que cela fonctionnait pour moi.
La troisième ligne ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') est la clé. Bonne réponse, merci!
peterh - Réintégrer Monica
2
Comme l'a dit @peterh, la ligne git config remote.origin.fetch 'refs/heads/*:refs/heads/*'est la réponse. Après avoir appuyé sur cette commande, je peux simplement git fetchet le repo se synchronise avec le distant.
joker
3
Ajoutez le référentiel nu en tant que référentiel distant, puis utilisez git push.
-u paramètre pour fetch était nécessaire, sinon j'obtiens le message d'erreur: "Refusing to fetch dans la branche actuelle refs / heads / master of non-bare repository" (voir aussi https://stackoverflow.com/a/19205680/4807875 )
Réponses:
Si vous souhaitez dupliquer tous les objets du référentiel principal, procédez comme suit dans le référentiel principal:
Vous pouvez également effectuer une récupération à l'intérieur du dépôt nu:
Vous ne pouvez pas faire un pull, car un pull veut fusionner avec
HEAD
, ce qu'un repo nu n'a pas.Vous pouvez les ajouter en tant que télécommandes pour vous éviter de taper à l'avenir:
Ensuite, vous pouvez simplement faire
ou
selon le repo dans lequel vous vous trouvez. Si
<whatever-name>
c'est le casorigin
, vous pouvez même l'omettre complètement.Avertissement: je ne suis pas un gourou git. Si je dis quelque chose de mal, j'aimerais être éclairé!
Mise à jour: lisez les commentaires!
la source
git-fetch --all
à l'intérieur du référentiel nu, je n'ai pas vu les mises à jour que j'avais apportées au référentiel principal, mais lorsquegit push --all <url-of-bare-repo>
je les ai poussées à partir du référentiel principal avec, je vois les mises à jour dansgit log
. Il y a probablement une explication simple à cela - quelqu'un peut-il expliquer?git log
ne montre pas ces mises à jour dans le dépôt nu. (Ni l'un ni l'autregit log --all
, et pas plus qu'un dépôt fonctionnel créé en clonant le dépôt nu - soit viagit log --all
ou simplement en regardant de nouveaux fichiers qui devraient apparaître là-haut). C'est un test assez rapide à voir par vous-même. La plupart du temps, je suis juste curieux de ce que je manque.git fetch -q origin master:master
dans votre dépôt nu local. Cela récupérera les nouveaux éléments de la branche principale de github et mettra à jour votre branche principale locale.master:master
est ce qu'il faut pour faire avancer HEAD vers celui du repo distant. Dans mon cas, à cause d'un problème, je ne pouvais plus me connecter à notre dépôt nu car git manquait. Jusqu'à ce que cela soit résolu, je fais un tunnel inverse et je vais au repo central en utilisant:git fetch ssh://localhost:8765/... master:master
et cela fonctionne comme un charme. Merci!git fetch origin *:*
J'ai créé un référentiel à l'aide de la commande suivante
git clone --bare <remote_repo>
Ensuite, j'ai essayé de mettre à jour le clone nu en utilisant la réponse de Thomas, mais cela n'a pas fonctionné pour moi. Pour mettre à jour le référentiel nu (ce que je pense que Let_Me_Be demandait), j'ai dû créer un référentiel miroir:
Ensuite, je pourrais exécuter la commande suivante dans le référentiel en miroir pour récupérer les mises à jour du référentiel principal:
Je suis tombé sur cette solution en lisant Mirror a Git Repository By Pulling
la source
[remote "origin"]
section, ajoutezfetch = +refs/*:refs/*
etmirror = true
La seule solution en plus de recréer avec
git clone --mirror
est de Gregor :alors vous pouvez
git fetch
et vous verrez les mises à jour. La chose étrange est qu'avant cela, même s'il y a unremote
configuré, il n'a pas de branches répertoriées dansgit branch -a
.la source
git remote update
de faire le travail.--force
et--prune
à lagit fetch
ligne.En supposant:
Récupérer avec:
Remarque:
--git-dir=foo.git
n'est pas nécessaire si vous accédezcd
d'abord au répertoire.la source
origin
n'est pas défini, vous pouvez toujours remplacer laorigin
pièce par le chemin / l'URL de votre référentiel d'origine. par exemple$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
Après beaucoup de déconner, j'ai trouvé que cela fonctionnait pour moi.
Une fois que:
À chaque fois que je souhaite synchroniser:
la source
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'
) est la clé. Bonne réponse, merci!git config remote.origin.fetch 'refs/heads/*:refs/heads/*'
est la réponse. Après avoir appuyé sur cette commande, je peux simplementgit fetch
et le repo se synchronise avec le distant.Ajoutez le référentiel nu en tant que référentiel distant, puis utilisez
git push
.la source
Pour moi, cette combinaison a fonctionné:
-u paramètre pour fetch était nécessaire, sinon j'obtiens le message d'erreur: "Refusing to fetch dans la branche actuelle refs / heads / master of non-bare repository" (voir aussi https://stackoverflow.com/a/19205680/4807875 )
la source