2014-06-23 8 views
2

J'ai un référentiel (origin) qui a été forké (en termes GitHub) à partir d'un autre référentiel (upstream). Je fais tout le développement dans les branches sujet et ne touche jamais les branches présentes dans le référentiel en amont (master, developement, 1.x, etc.).Mise à jour automatique des branches amont

Voici un exemple des branches dans mon dépôt

$ git branch -a  # plus hand annotations 
    development [upstream-maintained: should always be == upstream/development] 
    feature-1  [mine: should track origin/feature-1] 
    feature-2  [mine: should track origin/feature-2] 
* master  [upstream-maintained: should always be == upstream/master] 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/development 
    remotes/origin/feature-1 
    remotes/origin/feature-2 
    remotes/origin/master 
    remotes/upstream/development 
    remotes/upstream/gh-pages [I do not care about this..] 
    remotes/upstream/master 
    remotes/upstream/stable-1.x [...nor I care about these two..] 
    remotes/upstream/stable-2.x [...stable-* branches] 

Après rapportez de dépôt en amont, je dois passer par la fastidieuse tâche de mettre à jour tous les amont entretenues branches: je passe à master, I merge --ff-only upstream/master et pousser à l'origine. Cela doit être répété pour chaque branche entretenue en amont qui m'intéresse. S'il vous plaît noter que merge --ff-only fonctionne toujours parce que je ne touche jamais ces branches.

Je voudrais git pull pour faire toutes ces mises à jour fastidieuses pour moi.

Existe-t-il un moyen d'apprendre à git que les branches maintenues en amont doivent être poussées à origin mais tirées et suivies de upstream?

+0

Ces deux threads sont-ils utiles ?: http://stackoverflow.com/questions/4577874/git-automatically-fast-forward-all-tracking-branches-on-pull et http://stackoverflow.com/questions/4318161/can-git-pull-all- update-all-my-local-branches. À votre santé! – MBlanc

+0

@MBlanc, pas vraiment. Ces questions concernent une seule télécommande, alors qu'ici j'ai deux télécommandes différentes: une à tirer et une à pousser. Merci pour les liens cependant, les outils git-up semble bien. – gioele

Répondre

3

Comme mentionné dans "How can I pull from one remote and push to another with git?", vous pouvez:

  • assurez-vous de pousser à l'origine:

    git config remote.pushdefault origin 
    git config push.default matching 
    
  • configuration la branche amont:

    git fetch upstream 
    git branch -u upstream/master foo 
    

Notez que vous devriez re basez vos branches topic sur upstream/master (ne pas fusionner), afin de ne pas avoir de commits de fusion dans vos requêtes de tirage.
Cela signifie git push -f pour la mise à jour de votre fourche branche distante (qui mettra à jour la demande de tirage automatique)

Vous pouvez forcer un rebasage soit par:

git config autosetuprebase remote 
# or 

git branch.foo.rebase true 

Par exemple:

C:\Users\vonc\prog\git\so>git clone https://github.com/gioele/offlineimap.git 
Cloning into 'offlineimap'... 
remote: Counting objects: 9445, done. 
remote: Compressing objects: 100% (3701/3701), done. 
remote: Total 9445 (delta 4962), reused 9445 (delta 4962) 
Receiving objects: 100% (9445/9445), 5.75 MiB | 2.18 MiB/s, done. 
Resolving deltas: 100% (4962/4962), done. 
Checking connectivity... done. 

C:\Users\vonc\prog\git\so>cd offlineimap 

C:\Users\vonc\prog\git\so\offlineimap>git remote add upstream https://github.com/offlineimap/offlineimap.git 

Permet de voir ce que le maître fait référence pour l'instant:

C:\Users\vonc\prog\git\so\offlineimap>git branch -avvv 
* master     1746676 [origin/master] Make IDLE mode to work again 
    remotes/origin/HEAD  -> origin/master 

C:\Users\vonc\prog\git\so\offlineimap>git config --local -l 
remote.origin.url=https://github.com/gioele/offlineimap.git 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 
remote.upstream.url=https://github.com/offlineimap/offlineimap.git 
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/* 

Faisons l'origine comme destination pour une poussée:

C:\Users\vonc\prog\git\so\offlineimap>git config push.default matching 
C:\Users\vonc\prog\git\so\offlineimap>git config remote.pushdefault origin 

Changeons la branche amont:

C:\Users\vonc\prog\git\so\offlineimap>git fetch upstream 
remote: Counting objects: 55, done. 
remote: Compressing objects: 100% (55/55), done. 
remote: Total 55 (delta 25), reused 1 (delta 0) 
Unpacking objects: 100% (55/55), done. 
From https://github.com/offlineimap/offlineimap 
* [new branch]  master  -> upstream/master 

C:\Users\vonc\prog\git\so\offlineimap>git branch -u upstream/master master 
Branch master set up to track remote branch master from upstream. 

La branche master est définie comme la surveillance upstream/master:

C:\Users\vonc\prog\git\so\offlineimap>git br -avvv 
* master     1746676 [upstream/master: behind 10] Make IDLE mode to work again 

Maintenant un git pull (ou b Etter, un git pull --rebase) va tirer de upstream:

C:\Users\vonc\prog\git\so\offlineimap>git pull --rebase 
First, rewinding head to replay your work on top of it... 
Fast-forwarded master to 6bd76fed5a7e1e24310517b3510c465929870c08. 

(et 6bd76fed5a7e1e24310517b3510c465929870c08 a été upstream/master commit)

Un git push serait encore pousser à l'origine:

C:\Users\vonc\prog\git\so\offlineimap>git push 
remote: Permission to gioele/offlineimap.git denied to VonC. 
fatal: unable to access 'https://github.com/gioele/offlineimap.git/': The requested URL returned error: 403 

(normal, puisque je ne suis pas gioele, je n'ai pas accès en écriture à ce repo)

+0

Les branches de la première commande ne devraient-elles pas être permutées? 'git branch -u upstream/master master' – gioele

+0

Aussi, une fois que j'utilise' git config branch.master.remote origin', 'git push' refuse de pousser quoi que ce soit parce que" Everything is up-to-day "alors que l'amont a deux autres commet – gioele

+0

@gioele si vous ne tirez pas/rebase d'abord, alors oui, une poussée ne ferait rien. – VonC