Comment pousser vers un dépôt git non nu?

Je travaille habituellement 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é de ma télécommande) sur mon ordinateur portable.

Cependant, je ne peux pas tirer de ce référentiel du 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 dépôt nu. Comment puis-je pousser mes modifications dans mon référentiel distant?

125

5 réponses

receive.denyCurrentBranch updateInstead

Cette option a été ajoutée dans Git 2.3, et le serveur met à jour son arborescence de travail s'il est propre.

Donc, si vous vous assurez de toujours valider avant de tirer localement, et de garder un arbre de travail propre sur le serveur (ce que vous devriez faire pour éviter d'avoir des conflits de fusion), alors 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
93

Meilleure Option

Probablement le moyen le plus propre, le moins déroutant et le plus sûr de pousser dans votre référentiel distant non nu, est de pousser vers des branches dédiées dans la télécommande qui représentent les branches de votre ordinateur portable.

Regardons le cas le plus simple, et supposons que vous avez juste une branche dans chaque repo: master. Lorsque vous poussez vers le repo distant de votre ordinateur portable, au lieu de pousser master -> master, poussez master - > laptop-master (ou un nom similaire). De cette façon la poussée n'affecte pas la branche maître 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 maître locale sera poussée vers la branche nommée "laptop-master" dans le référentiel 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 Alternative

Il est également possible de simplement pousser master - > master, mais pousser vers la branche actuellement extraite d'un repo non nu n'est généralement pas recommandé, car cela peut être déroutant si vous ne comprenez pas ce qui se passe. C'est parce que pousser vers une branche extraite ne met pas à jour l'arbre de travail, donc vérifier git status dans la branche extraite qui a été poussée montrera exactement les différences opposées comme ce qui a été poussé le plus récemment. Cela serait particulièrement déroutant si l'arbre de travail était 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 simplement de pousser master - > master, alors la commande est juste:

git push origin

Mais lorsque vous revenez au repo distant, vous voudrez probablement faire un git reset --hard HEAD pour synchroniser l'arborescence de travail avec le contenu qui a été poussé. cela peut être dangereux , car s'il y a des changements non engagés dans l'arbre de travail distant que vous vouliez conserver, ils les effaceront. Assurez vous de savoir quelles sont les conséquences de cela devant vous essayez-le, ou au moins 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 mieux car il fait une fusion réelle (donc fonctionne avec des modifications non validées tout comme merge).

139
répondu Dan Moulding 2015-05-24 00:25:21

Je suggère d'avoir un référentiel bare et un repos de travail local (non-bare) dans votre serveur. Vous pouvez pousser les changements de l'ordinateur portable au repo nu du serveur, puis tirer de ce repo nu vers le repo de travail du serveur. La raison pour laquelle je dis cela est parce que vous pourriez avoir beaucoup de branches complètes/incomplètes dans le serveur que vous voudrez répliquer sur l'ordinateur portable.

De cette façon, vous n'avez pas à vous soucier de l'état de la branche extraite sur le repo de travail du serveur tout en poussant les modifications vers le serveur.

14
répondu Manish 2013-03-07 16:34:57

Une autre option consiste à configurer 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 user@remote

# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side

Et si vous voulez que le tunnel s'exécute en arrière-plan

$ ssh -fNnR 1234:localhost:22 user@remote
2
répondu Todd Freed 2015-05-23 16:58:23

Vous pouvez faire:

$git config --bool core.bare true

Cela peut être fait dans un référentiel nu ou central afin qu'il accepte tous les fichiers poussés à partir de référentiels Non nus. Si vous faites cela dans un référentiel non nu, nous ne pouvons pas pousser les fichiers du référentiel non nu au référentiel nu.

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

$git log dans le centre de repo.

Autre que si vous poussez vers GitHub, il affichera les fichiers là-bas.

0
répondu vidwan reddy 2018-01-20 20:45:50