Comment mettre à jour mon dépôt nu?

134

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.

Šimon Tóth
la source
2
Voir cette réponse: stackoverflow.com/questions/315911/…
Ken Bloom

Réponses:

83

Si vous souhaitez dupliquer tous les objets du référentiel principal, procédez comme suit dans le référentiel principal:

git push --all <url-of-bare-repo>

Vous pouvez également effectuer une récupération à l'intérieur du dépôt nu:

git fetch <url-of-main-repo>

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:

git remote add <whatever-name> <url-of-other-repo>

Ensuite, vous pouvez simplement faire

git push --all <whatever-name>

ou

git fetch <whatever-name>

selon le repo dans lequel vous vous trouvez. Si <whatever-name>c'est le cas origin, 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!

Thomas
la source
7
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:

git fetch --all

Je suis tombé sur cette solution en lisant Mirror a Git Repository By Pulling

Austen
la source
22
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 :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

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.

Colin D Bennett
la source
1
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.
Elliott Slaughter
46

En supposant:

$ git clone --bare https://github.com/.../foo.git

Récupérer avec:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

Remarque: --git-dir=foo.gitn'est pas nécessaire si vous accédez cdd'abord au répertoire.

antak
la source
2
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.

Une fois que:

git clone --mirror ssh://[email protected]:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

À chaque fois que je souhaite synchroniser:

cd /home/myhome/repo.git
git --bare fetch ssh://[email protected]:2000/repo
git  fetch ssh://[email protected]:2000/repo
git push --mirror remote_site
simonvc
la source
7
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.

Philipp
la source
Donc, si je veux faire cela sans pousser, je ne peux pas utiliser un référentiel nu et utiliser un lien symbolique ou quelque chose comme ça?
Šimon Tóth
Le pushing est la méthode normale pour transférer le contenu d'un référentiel vers un référentiel nu, il n'est pas nécessaire de l'éviter.
Philipp
2
Vous ne pouvez pas toujours pousser. Par exemple, si le bare est dans un réseau privé et que le dépôt principal est public (sur GitHub, par exemple)
fanf42
0

Pour moi, cette combinaison a fonctionné:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

-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 )

Alexandre Samoylov
la source