Je travaille habituellement sur un serveur distant via ssh (screen et vim), où je possède un référentiel Git. Parfois, je ne suis pas en ligne, j'ai donc un référentiel séparé (cloné à partir de 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 à un dépôt nu. Comment dois-je alors transmettre mes modifications à mon référentiel distant?
receive.denyCurrentBranch updateInstead
Cette option a été ajoutée dans Git 2.3 , et le serveur met à jour son arbre de travail s’il est propre.
Donc, si vous vous assurez de toujours valider avant d'extraire localement et de conserver une arborescence de travail vierge sur le serveur (ce que vous devriez 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
Meilleure option
Le moyen le plus propre, le moins déroutant et le plus sûr d’entrer dans votre référentiel distant non nu est probablement d’appeler 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’ayez qu’une branche dans chaque dépôt: maître. Lorsque vous appuyez sur le référentiel distant à partir de votre ordinateur portable, au lieu d'appuyer maître -> maître, Push maître -> maître-ordinateur portable (ou un nom similaire). De cette manière, le Push n’affecte pas la branche principale actuellement extraite dans le référentiel distant. Pour faire cela depuis 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 référentiel distant, vous aurez une nouvelle branche nommée "laptop-master" que vous pourrez ensuite fusionner dans votre master distant lorsque vous serez prêt.
Autre option
Il est également possible d’appuyer simplement maître -> maître, mais il est généralement déconseillé de pousser sur la branche actuellement extraite d’un dépôt non dépouillé, car elle peut être source de confusion si vous ne comprenez pas ce qui se passe. Cela s'explique par le fait que le transfert vers une branche extraite ne met pas à jour l'arbre de travail. Par conséquent, la vérification de git status
dans la branche extraite extraite indiquera les différences opposées à celles de la dernière poussée. Si l’arbre de travail était sale avant la fin du Push, il serait particulièrement déroutant, ce qui explique en grande partie pourquoi cela n’est pas recommandé.
Si vous voulez simplement appuyer sur master -> master, la commande est la suivante:
git Push Origin
Toutefois, lorsque vous revenez au référentiel distant, vous souhaiterez probablement créer un git reset --hard HEAD
pour synchroniser l’arborescence de travail avec le contenu transféré. _ {Cela peut être dangereux} _, car s'il y a des modifications {non validées} _ dans l'arbre de travail distant que vous souhaitez conserver, elles seront supprimées. Assurez-vous de savoir quelles en sont les conséquences avant de l'essayer, ou au moins effectuez d'abord une sauvegarde!
EDIT Depuis Git 2.3, vous pouvez utiliser la fonctionnalité "Push-to-deploy" de git Push: https://github.com/blog/1957-git-2-3-has-been-released . Toutefois, il est généralement préférable d’utiliser une branche distincte, puis une fusion, puisqu’elle réalise une fusion réelle (elle fonctionne donc avec des modifications non validées, comme le fait la fusion).
Je suggérerais d’avoir un référentiel nu et un dépôt de travail local (non-nu) sur votre serveur. Vous pouvez transmettre les modifications d'un référentiel nu vers un serveur depuis un ordinateur portable, puis passer de ce référentiel à un référentiel actif. La raison pour laquelle je dis cela est parce que vous pourriez avoir plusieurs branches complètes/incomplètes sur le serveur que vous voudrez reproduire sur le portable.
Ainsi, vous n'avez pas à vous soucier de l'état de la branche extraite sur le référentiel de travail du serveur lors de l'envoi de modifications au serveur.
Une autre option consiste à configurer un tunnel ssh inversé de sorte que vous puissiez tirer au lieu de Push.
# 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 fonctionne en arrière-plan
$ ssh -fNnR 1234:localhost:22 user@remote
Tu peux faire:
$git config --bool core.bare true
cela peut être fait dans un référentiel nu ou central de manière à accepter tous les fichiers poussés depuis des référentiels non nus . Si vous faites cela dans un référentiel non nu, nous ne pouvons pas transférer aucun fichier d'un référentiel non nu à nu.
Si vous pratiquez GIT en créant un référentiel central et non dépouillé sur un PC, il est possible que les fichiers envoyés ne soient pas affichés dans certains PC, mais cela a été fait. vous pouvez le vérifier en courant.
$git log
dans le dépôt central.
Autre que si vous appuyez sur GitHub, les fichiers y seront affichés.