Git pousser branche courante à une télécommande avec Heroku
-
18-09-2019 - |
Question
Je suis en train de créer une branche de mise en scène sur Heroku, mais il y a quelque chose que je ne comprends pas tout à fait.
En supposant que je l'ai déjà créé une application Heroku et la configuration de la télécommande pour pointer vers la mise en scène à distance, Si je fais:
git checkout -b staging staging-remote/master
Je reçois une branche locale appelée « mise en scène » qui suit la mise en scène à distance / maître - ou c'est ce que je pensais ....
git remote show staging-remote
me donne ceci:
remote staging
Fetch URL: git@heroku.com:myappname.git
Push URL: git@heroku.com:myappname.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
staging-remote merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
Comme vous pouvez le voir, l'attraction semble raisonnable, mais la poussée par défaut ne fonctionne pas. Cela implique que si je fais:
git pousser la mise en scène à distance
Je vais pousser ma branche maître local à la branche de mise en scène. Mais ce n'est pas ce que je veux .... Au fond, je veux fusionner les mises à jour dans ma branche de mise en scène, puis poussez facilement à heroku sans avoir à spécifier la branche comme ceci:
git push staging-remote mybranch:master
Ce qui précède est pas difficile à faire, mais je veux éviter de faire accidentellement la précédente pousser et pousser la mauvaise branche ... Ceci est d'autant plus important pour la branche de production, je voudrais créer!
J'ai essayé de jouer avec git config, mais ne l'ai pas compris comment obtenir ce droit encore ...
La solution
Je l'ai testé et @juba et @ versions de MatthewFord fonctionnent parfaitement!
git config remote.staging.push staging:master
Cela pousse ma branche locale sujet nommé mise en scène dans la branche à distance maître sur le dépôt distant nommé mise en scène .
@nickgrim le mettre sous la forme générale comme ceci:
git config remote.[remoteRepositoryName].push [localBranchName]:[remoteBranchName]
Mise à jour:
En outre, git moderne sera commodément exécuter la commande de configuration ci-dessus pour vous lorsque vous git push
avec l'option -u
:
git push -u staging staging:master
Autres conseils
J'ai une branche appelée Heroku, et cela a fonctionné pour moi:
git config remote.heroku.push heroku:master
le problème que vous êtes confronté est heroku ignore toutes les branches autres que maître.
Du livre "O'Reilly - Version Control with Git" Page 184 | Chapitre 11: Référentiels à distance
Lors d'une opération git push, vous voulez généralement de fournir et de publier les modifications vous avez fait sur vos branches locales sujet. Pour permettre aux autres de trouver vos changements dans la dépôt distant après que vous les télécharger, vos modifications doivent apparaître dans ce référentiel comme branches de sujet. Ainsi, au cours d'une commande git push typique, les branches source de votre dépôt sont envoyés au dépôt distant en utilisant un refspec tels que:
+refs/heads/*:refs/heads/*
Cette refspec peut être paraphrasé comme: À partir du dépôt local, prendre chaque nom de la branche se trouve sous l'espace de noms source
refs/heads/
et le placer dans un même nom, branche correspondant sous la destination espace de nomsrefs/heads/
dans le dépôt distant. La premièrerefs/heads/
fait référence à votre dépôt local (parce que vous êtes l'exécution d'un coup de pouce), et la deuxième fait référence au référentiel distant. Les astérisques veillent à ce que toutes les branches sont répliqués. ...
Voilà pourquoi l'exemple de Djouba devrait échouer. le refspec doit être corrigée:
git config remote.staging-remote.push +refs/heads/local_branch_name:refs/heads/master
Dans la page Everiday Git avec 20 commandes ou donc :
http://www.kernel.org/pub /software/scm/git/docs/everyday.html
Il semble que vous pouvez réaliser ce que vous voulez faire en ajoutant une directive de configuration à votre dépôt git local, quelque chose comme:
git config remote.staging-remote.push mybranch:refs/remotes/staging-remote/master
Alors, si vous faites un git push
de votre mybranch branche locale, il doit être poussé à la maître branche de votre la mise en scène à distance à distance.
Néanmoins, s'il vous plaît vérifier avec git remote show staging-remote
et tester soigneusement avant de l'utiliser, comme je suis loin d'être un expert git ...
Je ne pouvais pas trouver un moyen de le faire, mais à la fin je l'ai trouvé une tâche de coupe à portée de main pour le rendre facile: http://www.jbarnette.com/2009/11/ 10 / déploiement à heroku.html
Je vais avoir le même problème à essayer de comprendre comment faire face à la politique de Heroku d'ignorer toutes les branches, mais « maître ». Il défaites un peu le point tout en gardant des branches séparées si vous ne pouvez jamais tester la branche maître sur Heroku.
La conséquence de cette restriction est que quelle que soit la branche thématique locale je travaillerai, je voudrais un moyen facile de changer le maître de Heroku à cette branche thématique locale et faire un « git pousser -f » à maître sur-écriture sur Heroku. Inutile de dire que ce serait une très bonne idée d'avoir un dépôt distant séparé (comme Github), pour sauvegarder tout sans cette restriction. Je dirais que l'une « origine » et utiliser « Heroku » pour Heroku pour que « git push » toujours sauvegarde tout.
Ce que je suis arrivé à la lecture de la section "Pousser Refspecs" de http://progit.org /book/ch9-5.html est
git poussée heroku-sujet-branche locale: refs / heads / master
Ce que je voudrais vraiment est un moyen de mettre cela dans le fichier de configuration de sorte que « git pousser heroku » fait toujours ce qui précède, en remplaçant « branche locale sujet » avec le nom de tout ce que ma branche actuelle arrive à être.
Je peux poser une nouvelle question, pour voir si quelqu'un d'autre a compris comment faire.
Cela fonctionne. Je l'ai utilisé plus de quelques fois pour la mise en place avec les clients git-flow, Heroku, et un service git de sauvegarde.
.git / config pour le repo:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
[heroku]
account = youraccount
[remote "origin"]
url = git@bitbucket.org:youruser/yoursite.heroku.com.git # or github, etc.
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "staging"]
remote = origin
merge = refs/heads/staging
[branch "develop"]
remote = origin
merge = refs/heads/develop
[remote "production"]
pushurl = git@heroku.com:your-prod-app.git
push = master:master
[remote "staging"]
pushurl = git@heroku.com:your-staging-app.git
push = staging:master
Tout fonctionne correctement:
git push origin
git pull origin
git push staging
git push production
Pensez à fetch et pousser comme comme stdout et stdin, où les deux peuvent être redirigés ou fermé pour être un moyen. Aussi, si quelqu'un sait comment obtenir ces paramètres sans piratage .git / config, s'il vous plaît ne hésitez pas à modifier avec une modification, des points de karma ne manqueront pas de suivre.