Git remote : comment héberger vos documents et codes source sur un serveur

Git remote : comment héberger vos documents et codes source sur un serveur

Le vôtre si possible

Avatar de l'auteur
David Legrand

Publié dans

Logiciel

05/10/2020 11 minutes
15

Git remote : comment héberger vos documents et codes source sur un serveur

Utiliser Git pour gérer les versions de vos données localement est une chose, mais on est souvent amené à travailler sur ses fichiers depuis différentes machines ou en équipe. Dès lors, comment faire ? Il suffit d'utiliser un dépôt distant via un service clé en main ou votre propre serveur.

Comme évoqué dans un précédent article consacré au gestionnaire de versions Git, l'un de ses points forts, qui a notamment fait son succès à ses débuts, est sa conception non pas décentralisée, mais distribuée.

En plus de ne pas dépendre d'un serveur central comme SVN (par exemple), chacun peut disposer du sien, le faire échanger avec n'importe quel autre, comme bon lui semble. Chaque utilisateur peut disposer de sa propre copie locale ou distante d'un dépôt, l'héberger sur le ou les serveurs de son choix.

Réseau décentralisé distribué
Différence entre les réseaux (dé)centralisés et distribués par Paul Baran, l'un des pionniers d'Internet

Un point souvent oublié avec l'utilisation courante de services en ligne tels que BitBucket, GitLab ou GitHub qui ont tendance à « recentraliser » l'utilisation de Git. C'est pourtant ce qui permet de travailler facilement seul ou à plusieurs sur de même données, que ce soit à travers un réseau local ou Internet.

En langage Git, un dépôt distant est nommé « remote ». Voyons aujourd'hui comment en créer un et l'utiliser, que ce soit sur un Raspberry Pi, un NAS ou chez un hébergeur. Si Git propose nativement une solution exploitable via la ligne de commandes, il existe des alternatives avec interface web simple à installer.

Notre dossier sur la maîtrise de Git et de ses plateformes :

Git remote : premier contact

Dans cet article nous partirons du principe que vous disposez des bases concernant les concepts de Git et que vous l'avez d'installé sur votre machine. Si ce n'est pas le cas, nous vous invitons à lire notre précédent tutoriel.

Pour comprendre ce qu'est un dépôt distant (ou remote), nous allons en utiliser un déjà existant : celui de notre article sur la création d'un site internet statique, hébergé sur la plateforme GitHub. L'action que nous allons effectuer est nommée « clone » en langage Git. Elle consiste à créer un dépôt local sur notre machine pour y placer le contenu d'un dépôt distant. Il sera alors automatiquement considéré comme son remote.

GitHub CloneGitHub CloneGitHub, comme la plupart des services d'hébergement Git, indique l'URL à utiliser pour cloner un dépôt

Voici la commande à taper :

git clone https://github.com/davlgd/pwa-static-winget.git

Cela ne prend que quelques secondes, le projet étant assez léger. Un dossier nommé pwa-static-winget a été créé dans le dossier courant. Ce n'est pas simplement ses fichiers qui ont été récupérés, mais également tout leur historique. Outre le statut du dépôt, on peut demander à visualiser le graphique des commits par exemple :

cd pwa-static-winget
git status
git log --graph --oneline

On peut alors demander à obtenir les informations concernant les remotes du dépôt :

git remote -v

Le « -v » (verbose) est ici utilisé pour demander un affichage détaillé, qui permet d'obtenir les URL :

origin https://github.com/davlgd/pwa-static-winget.git (fetch)
origin https://github.com/davlgd/pwa-static-winget.git (push)

Le dépôt GitHub est nommé « origin ». Il s'agit d'une convention Git qui désigne en général le remote principal, utilisé par défaut. Il est ici utilisé pour deux actions différentes : fetch et push. Elles consistent à récupérer les fichiers depuis le dépôt ou à l'inverse d'envoyer le contenu du dépôt local au serveur. Nous y reviendrons plus loin.

Git Clone

Récupération d'un dépôt « nu »

Outre le fait d'être distant, quel est l'autre élément distinctif d'un remote ? Il s'agit d'un dépôt « bare » ou nu. La documentation de Git les définit comme « un dépôt qui ne contient pas de copie de répertoire de travail ». Pour voir ce qu'il en est en pratique, récupérons les données de notre projet GitHub dans un tel dépôt : 

cd ..
git clone --bare https://github.com/davlgd/pwa-static-winget.git

Vous noterez une première différence : le dossier créé est nommé cette fois pwa-static-winget.git. Et si vous naviguez en son sein, vous ne verrez plus les données du dépôt directement exploitables. Elles sont organisées telles qu'elles sont utilisées par Git (objets, références, etc.) avec des fichiers de configurations et autres scripts.

Il s'agit en réalité du contenu du dossier (caché) .git que l'on trouve dans les dépôts classiques. L'ensemble occupe donc moins d'espace : 144 ko pour 52 fichiers (41 dossiers) contre 264 ko pour 71 fichiers (50 dossiers).

Git DépôtGit Dépôt Bare
À gauche le dépôt classique avec fichiers de travail et techniques (.git), à droite le dépôt nu avec seulement les données techniques

Installation de Git sur votre serveur

Il faut donc voir un dépôt nu comme un simple outil technique, qui n'a pas vocation à être utilisé directement mais seulement comme source/destination pour d'autres dépôts. Comment en mettre un en place dans la pratique ? C'est finalement assez simple. Vous pouvez le faire sur votre machine locale et même l'utiliser comme remote, mais cela n'aurait que peu d'intérêt. Nous allons le faire sur un serveur distant (sur votre réseau local ou via Internet).

Pour cela, installez Git sur un serveur comme un Raspberry Pi, un NAS ou chez un hébergeur. Dans tous les cas, il vous faudra un accès au terminal de la machine, via le protocole SSH par exemple. Pour un Raspberry Pi, vous pouvez suivre l'un de nos guides d'installation de Raspbian OS, Manjaro ou Ubuntu.

S'il n'est pas présent par défaut, installez Git. Par exemple via APT sous Debian ou ses dérivés :

sudo apt install git

N'oubliez pas que vous pouvez faciliter l'accès en utilisant une paire de clé publique/privée plutôt qu'un mot de passe. Cela peut même être renforcé par une clé de sécurité physique. Tout est détaillé dans un précédent tutoriel. Pensez également à créer les comptes des utilisateurs devant avoir accès à votre serveur et leurs dossiers.

Une pratique courante est de créer un utilisateur/groupe nommé « git ». Vous pouvez alors l'associer à différentes clés SSH permettant à des tiers de s'y connecter ou créer plusieurs utilisateurs appartenant au groupe git. Aucune méthode n'est meilleure qu'une autre, tout dépend de la façon dont vous voulez opérer. 

Sur un NAS, l'accès SSH s'active en général dans les paramètres, Git étant le plus souvent proposé à l'installation sous la forme d'un paquet dans la boutique applicative. Par exemple dans Synology DSM 7.0 :

Synology SSHGit Server Synology
Activation de l'accès SSH et de l'accès d'un utilisateur au serveur Git

Serveurs Git prêts à l'emploi : Gitea, Gogs et compagnie

C'est également le cas chez Asustor, dont l'App Central propose de nombreuses solutions prêtes à l'emploi : GitBucket, Gitea ou encore Gogs. Seule cette dernière est maintenue directement par ses équipes. Il s'agit d'outils open source permettant d'accéder à des dépôts Git via une interface web à installer, sur son propre serveur.

Ils sont en général intéressants, car légers et simples à installer, dans votre NAS ou même un Raspberry Pi. Ils reprennent le plus souvent les mécaniques de GitHub, bien connues. Gitea vante pour sa part ses atouts face à ses concurrents, précisant être également simple à maintenir, gérant la double authentification, etc.

Attention tout de même : chez QNAP il n'existe par exemple aucune solution basique pour installer Git. Le constructeur renvoie plutôt à sa Container Station pour de tels usages. On a du mal à comprendre pourquoi il faut en passer par un conteneur pour installer un simple outil de gestion de versions pesant 30 Mo... 

C'est une solution également promue par Synology pour les outils plus complexes cités ci-dessus. La Community Edition de GitLab est ainsi proposée dans la boutique applicative mais passe par Docker. Pour les autres, tels que Gitea ou Gogs, il faudra chercher dans le registre DockerHub. Et donc posséder un NAS gèrant les conteneurs. Malheureusement, ce n'est pas le cas de tous. L'entrée de gamme n'a pas toujours l'application nécessaire.

Autre solution : passer par un hébergeur et son offre de cloud public. Scaleway propose par exemple GitLab et Gogs sous la forme d'images clé en main (Instant Apps). Même chose pour OVHcloud avec GitLab. Vous pouvez aussi simplement monter une instance et y installer Git pour l'utiliser comme serveur distant.

Gitea Docker Synology DSMGitea Docker Synology DSMGitea installé sur un NAS Synology via Docker

Création d'un dépôt distant et clonage local

Maintenant que notre serveur est configuré, passons à l'action. Nous indiquerons ici des commandes pour un NAS Synology mais elles peuvent être utilisées avec n'importe quel serveur. Il faudra simplement adapter l'IP de la machine, le nom de l'utilisateur et le dossier. Dans notre cas : 192.168.1.42, david et /volume1/gitServer/.

Connectez-vous en SSH à la machine : 

ssh [email protected]

Nous avons créé un dossier partagé repositories, on y créé le dossier de notre premier dépôt Git :

mkdir -p /volume1/repositories/repoTest.git
cd /volume1/repositories/repoTest.git

On initialise alors un dépôt nu et on ferme la connexion :

git init --bare
exit

Notez que si votre dépôt doit être partagé entre plusieurs utilisateurs d'un même groupe la commande devient :

git init --bare --shared
exit

On se place dans le dossier local où les données doivent être placées et on clone le dépôt :

git clone [email protected]:/volume1/repositories/repoTest.git
cd repoTest

Une alerte vous indiquera que le dépôt est vide. Vous pouvez vérifier que tout s'est bien passé :

git status

On peut effectuer un premier commit local : 

echo "# Hello, World !" > README.MD
git add README.MD
git commit -a -m "Premier commit"
git log

Si tout s'est bien passé vous verrez le résultat de votre commit apparaître avec ses métadonnées. Vos modifications faites, vous pouvez les « pousser » au serveur avec la commande suivante :

git push

Comme nous aurons l'occasion de le voir plus tard, cette commande courte revient à utiliser des paramètres par défaut. Ainsi, bien que ce ne soit pas précisé, on pousse la branche master vers le remote origin. Selon les cas, il vous sera éventuellement demandé de vous identifier. Les données sont désormais sur le serveur !

Travail sur plusieurs machines ou en équipe

Imaginons maintenant que vous vouliez travailler à plusieurs ou sur une machine différente. Quelle sera la marche à suivre ? Pour le simuler, nous allons cloner une seconde fois le dépôt distant. Vous pouvez aussi le faire depuis un second PC présent sur le même réseau local pour rendre l'expérience plus réaliste :

cd ..
git clone [email protected]:/volume1/repositories/repoTest.git repoTest2
cd repoTest2
git log

Ici on précise un nom de dossier cible, celui utilisé par défaut existant déjà. On voit bien que l'ensemble des données ont été récupérées et que l'information du premier commit est affichée.

Modifions maintenant le fichier README.MD en ajoutant une seconde ligne de texte :

echo "## Ceci est un sous-titre" >> README.MD

On effectue le commit puis on pousse les modifications sur le serveur :

git commit -a -m "Ajout d'un sous-titre"
git push

On retourne alors dans le précédent dépôt. Les données sont inchangées. Avant de les modifier, il faut vérifier que le serveur n'a pas déjà de nouvelles données (ce qui est le cas) avec un pull

cd ../repoTest
git pull

Cette commande agit comme un fetch (récupération des données) suivi d'un merge (fusion avec celles déjà en place). Une fois cette action effectuée, vous pouvez à nouveau modifier le fichier README.MD et passer d'un dépôt à l'autre. Cette façon de faire explique le besoin de travailler dans des branches différentes lorsque l'on est plusieurs à modifier un document ou un code source. Puis de les «  réconcilier », parfois via une pull request (PR).

Dans la suite de ce dossier, nous vous expliquerons comment travailler avec plusieurs remotes. Notamment pour modifier vos fichiers sur un serveur local « privé », puis le partager régulièrement sur un service en ligne public.

Git Distributed WorkflowGit Distributed WorkflowDeux manières différentes de travailler en équipe selon la documentation Git

Écrit par David Legrand

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

Git remote : premier contact

Récupération d'un dépôt « nu »

Installation de Git sur votre serveur

Serveurs Git prêts à l'emploi : Gitea, Gogs et compagnie

Création d'un dépôt distant et clonage local

Travail sur plusieurs machines ou en équipe

Fermer

Commentaires (15)



Dans la suite de ce dossier, nous vous expliquerons comment travailler avec plusieurs remotes. Notamment pour modifier vos fichiers sur un serveur local « privé », puis le partager régulièrement sur un service en ligne public.




Au risque de spoiler ( :langue: ), une approche comme certains projets de logiciels libres qui ont leur propre repository Git et publient en parallèle sur Github en lecture seule pour bénéficier de la visibilité de ce dernier ?



Sinon j’aime bien l’image qui explique la différence entre centralisé, décentralisé et distribué. Je n’avais jamais vu cette modélisation et c’est simple et très clair. :yes: (notamment les deux derniers qu’on peut avoir tendance à confondre)


Pourtant elle est connue (certains en ont même fait un t-shirt de mémoire :D). Pour les remotes multiples, ça peut être une solution, d’autres publient sur GitLab et GitHub en //. In fine, chacun fait un peu comme il le souhaite, c’est tout l’intérêt de l’outil.


David_L

Pourtant elle est connue (certains en ont même fait un t-shirt de mémoire :D). Pour les remotes multiples, ça peut être une solution, d’autres publient sur GitLab et GitHub en //. In fine, chacun fait un peu comme il le souhaite, c’est tout l’intérêt de l’outil.


C’est pas la première fois que je louperais un truc “hyper connu” :transpi:



Ou alors j’ai probablement du le voir sous une autre forme, notamment sur les sujets liés au Fediverse où la notion de décentralisé / distribué peut parfois se confondre.


En plus de Gogs et Gitea, on pourra aussi mentionner Gitbucket qu’on utilise à mon taf (Ne pas confondre avec Bitbucket !!!). Ne connaissant pas du tout les 2 premiers, je serais bien incapable de les comparer.


Il est mentionné dans l’article


David_L

Il est mentionné dans l’article


hello David,
y a un moyen de retrouver l’ensemble des articles sur git ? d’habitude pour les dossiers, y un “paragraphe” rapide avec l’ensemble des articles liés, mais pour git c’est pas systématique (meme si certains liens sont dans le texte).
Possible d’avoir d’une manière ou d’une autre ce type d’accès rapide ?


Oups ! désolé j’ai lu trop vite :oops:


perso j’utilise gitolite ça permet de gérer les accès via ssh (et d’avoir des scripts de déploiement après des push)



super ces articles :yes:


Je me pose la question de l’utilité d’avoir un remote hébergé chez soi, et d’un autre chez Github ou Gitlab. Quitte à envoyer son code chez ces derniers, pourquoi héberger un serveur chez soi?


histoire de ne pas être dépendant d’un changement de politique ?


Comme dit dans l’article, tu peux très bien avoir un dépôt local et un remote “interne” et ensuite utiliser ces plateformes comme un outil de diffusion public.



L’avantage c’est que tu peux garder toute le travail (commits, etc.) visible, mais ne décider de le publier que quand bon te semble (pour une release particulière par exemple).



Mais c’est comme tout, c’est une possibilité : tu n’en a pas l’utilité, ne l’utilise pas. Cela ne veut pas dire que ce ne sera pas utile par la suite ou à d’autres.



Oui je dois juste l’ajouter mais il faut que je revois un point dans l’organisation du dossier :chinois:


David_L

Comme dit dans l’article, tu peux très bien avoir un dépôt local et un remote “interne” et ensuite utiliser ces plateformes comme un outil de diffusion public.



L’avantage c’est que tu peux garder toute le travail (commits, etc.) visible, mais ne décider de le publier que quand bon te semble (pour une release particulière par exemple).



Mais c’est comme tout, c’est une possibilité : tu n’en a pas l’utilité, ne l’utilise pas. Cela ne veut pas dire que ce ne sera pas utile par la suite ou à d’autres.



Oui je dois juste l’ajouter mais il faut que je revois un point dans l’organisation du dossier :chinois:


Merci je n’avais en effet pas pensé à cette situation. Pour le coup, j’en vois bien l’intérêt désormais. Je vais réétudier la question.


itea

Merci je n’avais en effet pas pensé à cette situation. Pour le coup, j’en vois bien l’intérêt désormais. Je vais réétudier la question.


Personnellement, c’est parce que je ne veux pas aller nourrir les ricains et leur besoins de télémétries, et également contribuer à une utilisation frugale / sobre d’internet. C’est aussi toute la démarche de posséder un NAS chez moi.


Thoscellen

Personnellement, c’est parce que je ne veux pas aller nourrir les ricains et leur besoins de télémétries, et également contribuer à une utilisation frugale / sobre d’internet. C’est aussi toute la démarche de posséder un NAS chez moi.


Ma question n’était pas sur le fait d’héberger son propre serveur Git. Ça je le conçois très bien, notamment pour la vie privée comme tu le dis. Je m’interrogeais sur le fait d’avoir un serveur local ET remote. David m’a très bien répondu.


Au boulot je maintiens du code sur Solaris. Tout le monde était très content d’utiliser git en mode centralisé. Et là je suis arrivé et j’ai dit




Mais les mecs, git c’est distribué ! Tu peux juste pousser sur ta Solaris de test direct depuis ta machine !




Puis là j’ai découvert git upload-pack et les collègues ont ricané :mad2: