"fetch-all" dans un dépôt git nu ne synchronise pas les branches locales avec les branches distantes

j'essaie de synchroniser périodiquement un dépôt vide git, mes branches locales sont créées en utilisant l'option" --track". voici ma config (sans choses inutiles):

[core]
        bare = true
[remote "origin"]
        url = [email protected]:Ummon/D-LAN.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[branch "website"]
        remote = origin
        merge = refs/heads/website

je dois utiliser la commande' cp 'pour mettre à jour les branches locales:

 git fetch --all
 cp -r refs/remotes/origin/* refs/heads

y a-t-il une solution plus élégante?

10
demandé sur simont 2011-04-06 02:27:05
la source

1 ответов

au lieu de copier les fichiers ref autour (bad bad bad!) utiliser git update-ref

notez que vous pouvez avoir ce que vous vouliez assez facilement dans un dépôt nu en poussant au lieu de tirer.

utilisez ceci:

 git clone --mirror . /tmp/bareclone

pour créer le dépôt nu que vous voulez garder complètement en phase Maintenant, pour synchroniser toutes les branches avec le miroir sans contact, utilisez

 git push /tmp/bareclone --mirror

noter que cela permettra également enlevez toutes les têtes qui ne sont pas dans le rapport source mais qui sont (encore) dans le bareclone. Notez également que vous pouvez utiliser send-pack à la place de push là parce que cette interface est plutôt faible et effectivement mis en œuvre par send-pack

HTH


comme l'a noté le commentateur, j'ai légèrement évité le sujet qu'il ne semble pas possible à la fois de faire l'inverse. Cependant, vous pouvez obtenir un long chemin vers l'objectif en faisant quelque chose légèrement avancé comme:

1. Simple, sûr et assez inattendu.

git fetch $url -- $(git ls-remote -h $url |
    while read sha ref; do echo "$ref:refs/remotes/fetched/${ref#refs/heads/}"; done)

Set `url=git://your.serveur/projet.git", par exemple

j'ai veillé à ce que les FRE soient créés dans un endroit modérément sûr. L'effet très similaire à ce.

git remote add fetched $url --fetch

donc il n'y a pas beaucoup, mais il vous montre comment utiliser des commandes de plomberie pour y parvenir, de sorte que nous pouvons maintenant les adapter à nos besoins:

2. Chercher directement dans les branches locales (chefs)

maintenant si vous êtes sûr de savoir ce que vous faites vous pouvez utiliser le style suivant pour obtenir les branches dupliquées localement:

git init --bare .
git fetch $url -- $(git ls-remote -h $url |
    while read sha ref; do echo "$ref:$ref"; done)

Note : si vous voulez forcer mettre à jour (par exemple quand il n'y a pas de traction rapide vers l'avant à cause d'un rebase en amont, réinitialiser, filter-branch modifiée ou de s'engager (en général-tout réécrit l'histoire) remplacer echo "$ref:$ref" par echo "+$ref:$ref" ; (Merci Dov )

3. Le mois complet

cela peut aussi être combiné, donc vous pouvez aussi avoir une définition à distance. je le recommande car cela signifie que les branches locales traquent celles des télécommandes, et vous aurez mieux options d'isolation / récupération si vous bloquez accidentellement une partie de la propagation locale sur ces branches avec ces puissantes commandes fetch

git init --bare .
git remote add fetched $url --fetch
git for-each-ref --format='%(refname:short)' -- 'refs/remotes/fetched/' |
    while read ref; do git branch -t "$(basename "$ref")" "$ref"; done

Avoir du plaisir, HTH

18
répondu sehe 2017-05-23 13:24:16
la source

Autres questions sur git git-fetch git-bare