2009-11-19 6 views
114

Je travaille généralement sur un serveur distant via ssh (screen et vim), où j'ai un dépôt Git. Parfois, je ne suis pas en ligne, donc j'ai un référentiel séparé (cloné depuis ma télécommande) sur mon ordinateur portable.Comment faire pour pousser vers un dépôt Git non-nu?

Cependant, je ne peux pas tirer de ce référentiel sur le côté distant car je suis généralement derrière un pare-feu ou je n'ai pas d'adresse IP publique.

J'ai lu que je devrais pousser juste à un référentiel nu. Comment puis-je transférer mes modifications dans mon référentiel distant?

+0

connexes: http://stackoverflow.com/questions/12265729/git-config-receive-denycurrentbranch – prusswan

+2

avoir 2 repos à distance, un nu et un normal, et utiliser des crochets. semble être un problème, mais selon [git ready] (http://gitready.com/advanced/2009/02/01/push-to-only-bare-repositories.html) et [le wiki officiel de git] (https : //git.wiki.kernel.org/index.php? title = Git_FAQ & oldid = 23811 # Why_won.27t_I_see_changes_in_the_remote_repo_after_.22git_push.22.3F), vous devriez seulement ** pousser à un repo nu **. c'est probablement la raison pour laquelle la plupart des hôtes repo git (par exemple GitHub, Bitbucket) incluent des hooks post-réception, donc vous pouvez POST à ​​une URL sur votre serveur qui exécute un script qui exécute par exemple 'git pull github master'. –

Répondre

69

receive.denyCurrentBranch updateInstead, ajouté in Git 2.3, met également à jour l'arborescence de travail du serveur si elle est propre. Par conséquent, si vous vous assurez de toujours valider avant de tirer localement et de conserver une arborescence de travail propre sur le serveur (ce que vous devez faire pour éviter les conflits de fusion), cette option est une bonne solution.

Exemple d'utilisation:

git init server 
cd server 
touch a 
git add . 
git commit -m 0 
git config --local receive.denyCurrentBranch updateInstead 

cd .. 
git clone server local 
cd local 
touch b 
git add . 
git commit -m 1 
git push origin master:master 

cd ../server 
ls 

Sortie:

a 
b 
+6

Cela devrait vraiment être la réponse acceptée. C'est super simple et fonctionne très bien, comme on peut s'y attendre. Merci! – mav

+1

Excellente façon de représenter –

+1

Bonne solution qui garde tout en l'état. –

140

meilleure option

Probablement la plus propre, moins confus, et le plus sûr moyen de pousser dans votre dépôt distant non-nu, est de pousser à des branches dédiées à la télécommande qui représentent vos branches d'ordinateurs portables.

Regardons le cas le plus simple, et supposons que vous avez juste une branche dans chaque repo: maître. Lorsque vous poussez vers le repo distant à partir de votre ordinateur portable, au lieu de pousser maître -> maître, appuyez sur maître -> ordinateur portable-maître (ou un nom similaire). De cette façon, la poussée n'affecte pas la branche maîtresse actuellement extraite dans le repo distant. Pour ce faire, à partir de l'ordinateur portable, la commande est assez simple:

git push origin master:laptop-master 

Cela signifie que la branche de maître local sera poussé à la branche nommée « maître d'ordinateur portable » dans le dépôt distant. Dans votre repo distant, vous aurez une nouvelle branche nommée "laptop-master" que vous pourrez ensuite fusionner dans votre maître distant lorsque vous serez prêt.

Option Autre

Il est également possible il suffit de pousser maître -> maître, mais poussant à la branche check-out actuellement d'une pension non-nu est généralement pas recommandée, car elle peut être source de confusion si vous Je ne comprends pas ce qui se passe. En effet, le fait de pousser vers une branche empruntée ne met pas à jour l'arborescence de travail. Par conséquent, si vous vérifiez git status dans la branche extraite dans laquelle elle a été insérée, les différences seront exactement les mêmes que celles qui ont été les plus récentes. Il serait particulièrement déroutant que l'arbre de travail soit sale avant que la poussée ne soit faite, ce qui est une grande raison pour laquelle ce n'est pas recommandé.

Si vous voulez essayer maître juste pousser -> maître, la commande est juste:

git push origin 

Mais quand vous revenez à la prise en pension à distance, vous voulez le plus susceptible de faire git reset --hard HEAD à obtenir l'arbre de travail en synchronisation avec le contenu qui a été poussé. Cela peut être dangereux, car s'il y a non validés modifications dans l'arborescence de travail à distance que vous souhaitez conserver va les effacer. Assurez-vous de connaître les conséquences avant d'essayer, ou au moins de faire une sauvegarde en premier!

EDIT Depuis Git 2.3, vous pouvez utiliser "push-to-deploy" git push: https://github.com/blog/1957-git-2-3-has-been-released. Mais pousser vers une branche séparée et ensuite fusionner est généralement meilleur car il effectue une fusion réelle (donc fonctionne avec des modifications non validées comme le fait la fusion).

+1

Est-il possible d'automatiser le branchement après avoir poussé le laptop-master? – rdoubleui

+3

@rdoubleui: Voulez-vous dire "automatiser le * fusionnement"? Si c'est le cas, non, il n'est pas possible d'automatiser la fusion car les fusions ne sont pas garanties sans intervention humaine. Il peut y avoir des conflits qui doivent être résolus. –

+0

Je voulais dire "automatiser la fusion", oui. Merci, encore en train d'apprendre. – rdoubleui

13

Je suggère d'avoir un référentiel nu et un local de travail (non-bare) repos sur votre serveur. Vous pouvez transférer les modifications de l'ordinateur portable vers le serveur, puis retirer ce dépôt brut sur le serveur.La raison pour laquelle je dis ceci est parce que vous pourriez avoir beaucoup de branches complètes/incomplètes dans le serveur que vous voudrez reproduire sur l'ordinateur portable. De cette façon, vous n'avez pas à vous inquiéter de l'état de la branche extraite du repo de travail du serveur lorsque vous apportez des modifications au serveur.

+0

Simple comme ça. –

1

Une autre option consiste à installer un tunnel ssh inverse afin que vous puissiez tirer au lieu de pousser.

# start the tunnel from the natted box you wish to pull from (local) 
$ ssh -R 1234:localhost:22 [email protected] 

# on the other box (remote) 
$ git remote add other-side ssh://[email protected]:1234/the/repo 
$ git pull other-side 

Et si vous voulez que le tunnel de fonctionner en arrière-plan

$ ssh -fNnR 1234:localhost:22 [email protected] 
0

Vous pouvez faire:

$git config --bool core.bare true

cela peut être fait dans le dépôt nu ou central, de sorte que acceptera tous les fichiers qui sont poussés à partir de dépôts non nus. Si vous faites cela dans un dépôt non nu, nous ne pouvons pas pousser les fichiers du référentiel non nu vers le référentiel nu.

Si vous pratiquez GIT en créant un repo central et non nu sur PC, il se peut qu'il ne montre pas les fichiers poussés sur certains PC mais qu'il a été poussé. vous pouvez le vérifier en cours d'exécution.

$git log dans le référentiel central.

Autre que si vous poussez sur GitHub il montrera les fichiers là.

Questions connexes