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.
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.
Réponses:
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!
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?
git log
ne 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 --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:
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
[remote "origin"]
section, ajoutez fetch = +refs/*:refs/*
etmirror = true
La seule solution en plus de recréer avec git clone --mirror
est de Gregor :
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'
alors vous pouvez git fetch
et vous verrez les mises à jour. La chose étrange est qu'avant cela, même s'il y a un remote
configuré, il n'a pas de branches répertoriées dans git branch -a
.
git remote update
de faire le travail.
--force
et --prune
à la git fetch
ligne.
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.git
n'est pas nécessaire si vous accédez cd
d'abord au répertoire.
origin
n'est pas défini, vous pouvez toujours remplacer la origin
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:
git clone --mirror ssh://git@source.address: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://git@source.address:2000/repo
git fetch ssh://git@source.address:2000/repo
git push --mirror remote_site
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 simplement git 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
.
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 )