Je travaille généralement sur un serveur distant via ssh (screen et vim), où j'ai un référentiel 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.
Cependant, je ne peux pas extraire 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 vers un référentiel nu. Comment dois-je ensuite envoyer mes modifications dans mon référentiel distant?
git pull github master
.Réponses:
receive.denyCurrentBranch updateInstead
Cette option a été ajoutée dans Git 2.3 et permet au serveur de mettre à jour son arbre de travail s'il est propre.
Donc, si vous vous assurez de toujours vous engager avant de tirer localement et de conserver une arborescence de travail propre sur le serveur (ce que vous devriez faire pour éviter les conflits de fusion), cette option est une bonne solution.
Exemple d'utilisation:
Production:
la source
--local
facultatif?--local
n'affecte que le répertoire courant,--global
affecte tous les dépôts git avec~/.gitconfig
, voirman git-config
.Meilleure option
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 probablement de pousser vers des branches dédiées dans la télécommande qui représentent les branches de votre ordinateur portable.
Examinons le cas le plus simple et supposons que vous n'avez qu'une seule branche dans chaque dépôt: master. Lorsque vous poussez vers le référentiel distant depuis votre ordinateur portable, au lieu de pousser master -> master, push master -> laptop-master (ou un nom similaire). De cette façon, le push n'affecte pas la branche principale actuellement extraite dans le référentiel distant. Pour ce faire depuis l'ordinateur portable, la commande est assez simple:
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 dépôt distant, vous aurez une nouvelle branche nommée "laptop-master" que vous pourrez ensuite fusionner dans votre remote master 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 dépôt non nu n'est généralement pas recommandé, car cela peut être déroutant si vous ne comprenez pas ce qui se passe. En effet, le fait de pousser vers une branche extraite ne met pas à jour l'arborescence de travail, donc vérifier
git status
de la branche extraite qui a été poussée montrera exactement les différences opposées à ce qui a été le plus récemment poussé. Cela deviendrait particulièrement déroutant si l'arbre de travail était sale avant la poussée, ce qui est une grande raison pour laquelle cela n'est pas recommandé.Si vous voulez essayer de pousser simplement master -> master, alors la commande est juste:
Mais lorsque vous revenez au référentiel distant, vous voudrez probablement faire une
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 modifications non validées dans l'arborescence de travail à distance que vous vouliez conserver, elles les effaceront. Assurez-vous de savoir quelles en sont les conséquences avant de l'essayer, ou du moins faites d'abord une sauvegarde!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 distincte, puis fusionner est généralement préférable car il effectue une fusion réelle (fonctionne donc avec des modifications non validées, tout comme la fusion le fait).
la source
git config receive.denyCurrentBranch ignore
doit être fait avant de pousser vers desgit push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
Je suggérerais d'avoir un référentiel nu et un repos local (non nu) sur votre serveur. Vous pouvez transférer les modifications d'un ordinateur portable au référentiel nu de serveur, puis extraire de ce référentiel nu au référentiel de travail du serveur. La raison pour laquelle je dis cela est que vous pourriez avoir de nombreuses branches complètes / incomplètes sur 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 référentiel de travail du serveur lors de la transmission des modifications au serveur.
la source
Une autre option consiste à configurer un tunnel SSH inversé afin que vous puissiez tirer au lieu de pousser.
Et si vous voulez que le tunnel fonctionne en arrière-plan
la source
Tu peux 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 qui sont 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 de fichiers d'un référentiel non nu vers un 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 dans certains PC, mais il a été poussé. vous pouvez le vérifier en exécutant.
$git log
dans le repo central.Sauf si vous poussez sur GitHub, les fichiers y seront affichés.
la source