web-dev-qa-db-fra.com

Comment créer un référentiel Git distant à partir d'un local?

J'ai un référentiel Git local. Je souhaite le rendre disponible sur un serveur distant, compatible ssh. Comment puis-je faire cela?

212
Nips

Je pense que vous créez un référentiel nu du côté distant, git init --bare, ajoutez le côté distant en tant que suivi Suivi/extraction pour votre référentiel local (git remote add Origin URL), puis localement, vous dites simplement git Push Origin master. Désormais, tout autre référentiel peut pull à partir du référentiel distant.

258
Kerrek SB

Pour configurer initialement un serveur Git, vous devez exporter un référentiel existant vers un nouveau référentiel nu, un référentiel qui ne contient pas de répertoire de travail. Ceci est généralement simple à faire. Afin de cloner votre référentiel pour créer un nouveau référentiel nu, vous exécutez la commande clone avec l'option --bare. Par convention, les répertoires de référentiels nus se terminent par .git, comme suit:

$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/

Cette commande prend le référentiel Git lui-même, sans répertoire de travail, et crée un répertoire spécifiquement pour lui seul.

Maintenant que vous avez une copie nue de votre référentiel, il ne vous reste plus qu'à le mettre sur un serveur et à configurer vos protocoles. Supposons que vous avez configuré un serveur appelé git.example.com auquel vous avez accès SSH et que vous souhaitez stocker tous vos référentiels Git dans le répertoire /opt/git. Vous pouvez configurer votre nouveau référentiel en copiant votre référentiel nu sur:

$ scp -r my_project.git [email protected]:/opt/git

À ce stade, les autres utilisateurs disposant d'un accès SSH au même serveur disposant d'un accès en lecture au répertoire /opt/git peuvent cloner votre référentiel en exécutant

$ git clone [email protected]:/opt/git/my_project.git

Si un utilisateur SSH est connecté à un serveur et a un accès en écriture au répertoire /opt/git/my_project.git, il aura également automatiquement un accès Push. Git ajoutera automatiquement les autorisations d'écriture de groupe à un référentiel correctement si vous exécutez la commande git init avec l'option --shared.

$ ssh [email protected]
$ cd /opt/git/my_project.git
$ git init --bare --shared

Il est très facile de créer un référentiel Git, de créer une version nue et de le placer sur un serveur auquel vous et vos collaborateurs disposez d'un accès SSH. Vous êtes maintenant prêt à collaborer sur le même projet.

71
Binoy Babu

Une note pour les personnes qui ont créé la copie locale sous Windows et souhaitent créer un référentiel distant correspondant sur un système Unix-line, où les fichiers texte reçoivent les terminaisons LF, sur d'autres clones, par les développeurs des systèmes de type Unix, mais CRLF se termine sous Windows.

Si vous avez créé votre référentiel Windows avant le configuration de la traduction de fin de ligne , vous avez un problème. Le paramètre par défaut de Git n'est pas de traduction, votre jeu de travail utilise donc CRLF, mais votre référentiel (c'est-à-dire les données stockées sous .git) a également enregistré les fichiers au format CRLF.

Lorsque vous appuyez sur la télécommande, les fichiers enregistrés sont copiés tels quels, aucune traduction de fin de ligne n’a lieu. (La traduction de fin de ligne se produit lorsque les fichiers sont validés dans un référentiel, et non lorsque les référentiels sont poussés). Vous vous retrouvez avec CRLF dans votre référentiel de type Unix, ce qui n'est pas ce que vous voulez.

Pour obtenir LF dans le référentiel distant, vous devez vous assurer que LF se trouve d'abord dans le référentiel local, en en normalisant votre référentiel Windows . Cela n'aura aucun effet visible sur votre groupe de travail Windows, qui a toujours les fins CRLF. Toutefois, lorsque vous appuyez sur Remote, la télécommande obtiendra correctement LF.

Je ne sais pas s'il existe un moyen facile de déterminer les fins de ligne que vous avez dans votre référentiel Windows. J'imagine que vous pouvez le tester en définissant core.autocrlf = false, puis en le clonant (si le référentiel a LF terminaisons, le clone aura aussi LF).

8
user1804620

Un référentiel distant est généralement un référentiel nu, un référentiel Git ne comportant aucun répertoire de travail. Etant donné que le référentiel est uniquement utilisé en tant que point de collaboration, il n’ya aucune raison de demander à un instantané d’être extrait sur le disque; ce ne sont que les données Git. En termes simples, un référentiel nu est constitué du contenu du répertoire .git de votre projet et rien d’autre.

Vous pouvez créer un référentiel Git nu avec le code suivant:

$ git clone --bare /path/to/project project.git

Une des options pour avoir un référentiel git distant est d'utiliser le protocole SSH:

Un protocole de transport commun pour Git lorsque l'auto-hébergement s'effectue via SSH. C’est parce que l’accès SSH aux serveurs est déjà configuré dans la plupart des endroits - et si ce n’est pas le cas, c’est facile à faire. SSH est également un protocole réseau authentifié et, du fait de son omniprésence, il est généralement facile à configurer et à utiliser.

Pour cloner un référentiel Git sur SSH, vous pouvez spécifier une URL ssh:// comme ceci:

$ git clone ssh://[user@]server/project.git

Ou vous pouvez utiliser la syntaxe plus courte de type scp pour le protocole SSH:

$ git clone [user@]server:project.git

Dans les deux cas ci-dessus, si vous ne spécifiez pas le nom d'utilisateur facultatif, Git supposera que vous êtes actuellement connecté.

Les pros

Les avantages de l'utilisation de SSH sont nombreux. Premièrement, SSH est relativement facile à configurer: les démons SSH sont monnaie courante, de nombreux administrateurs réseau en ont l'expérience et de nombreuses distributions de systèmes d'exploitation sont configurées avec eux ou disposent d'outils pour les gérer. Ensuite, l'accès via SSH est sécurisé: tous les transferts de données sont cryptés et authentifiés. Enfin, à l'instar des protocoles HTTPS, Git et Local, SSH est efficace, rendant les données aussi compactes que possible avant de les transférer.

Les inconvénients

L’aspect négatif de SSH est qu’il ne prend pas en charge l’accès anonyme à votre référentiel Git. Si vous utilisez SSH, les utilisateurs doivent avoir un accès SSH à votre machine, même en lecture seule, ce qui ne rend pas SSH propice aux projets open source pour lesquels les utilisateurs pourraient simplement vouloir cloner votre référentiel pour l’examiner. Si vous l’utilisez uniquement au sein de votre réseau d’entreprise, SSH est peut-être le seul protocole à traiter. Si vous souhaitez autoriser un accès anonyme en lecture seule à vos projets et que vous souhaitez également utiliser SSH, vous devez configurer SSH pour que vous puissiez utiliser Push in, mais que les autres utilisateurs puissent en extraire.

Pour plus d'informations, consultez la référence: Git sur le serveur - Les protocoles

2
Amirhossein72

Vous devez créer un répertoire sur un serveur distant. Utilisez ensuite la commande "git init" pour le définir en tant que référentiel. Cela devrait être fait pour chaque nouveau projet que vous avez (chaque nouveau dossier)

En supposant que vous ayez déjà configuré et utilisé git à l'aide de clés ssh, j'ai écrit un petit script Python qui, lorsqu'il est exécuté à partir d'un répertoire de travail, configure une télécommande et l'initialise sous la forme d'un référentiel git. Bien sûr, vous devrez éditer le script (une seule fois) pour lui indiquer le serveur et le chemin racine pour tous les référentiels.

Vérifiez ici - https://github.com/skbobade/ocgi

2
Sam

Il existe une différence intéressante entre les deux solutions populaires ci-dessus:

  1. Si vous créez le référentiel nu comme ceci:

     cd /outside_of_any_repo
    mkdir my_remote.git 
     cd my_remote.git 
     git init --bare 
    

puis

cd  /your_path/original_repo
git remote add Origin /outside_of_any_repo/my_remote.git
git Push --set-upstream Origin master

Ensuite, git configure la configuration dans 'original_repo' avec cette relation:

original_repo Origin --> /outside_of_any_repo/my_remote.git/

avec ce dernier comme télécommande distante. Et la télécommande en amont n'a pas d'autres télécommandes dans sa configuration.

  1. Cependant, si vous le faites en sens inverse:

     (du répertoire original_repo) 
     cd .. 
     git clone --bare original_repo /outside_of_any_repo/my_remote.git
    

puis 'my_remote.git' se termine avec sa configuration ayant 'Origine' renvoyant à 'original_repo' en tant que distant, avec un remote.Origin.url équivalent au chemin du répertoire local, qui peut ne pas être approprié s'il doit être déplacé à un serveur.

Bien que cette référence "distante" soit facile à supprimer ultérieurement si elle ne convient pas, "original_repo" doit encore être configuré pour pointer sur "my_remote.git" en tant que télécommande en amont (ou vers l'endroit où il se rend être partagé de). Donc techniquement, vous pouvez arriver au même résultat en quelques étapes supplémentaires avec l’approche n ° 2. Mais le n ° 1 semble être une approche plus directe pour créer un "référentiel central nu partagé" provenant d'un local, approprié pour passer à un serveur, avec moins d'étapes. Je pense que cela dépend du rôle que vous souhaitez que le référentiel à distance joue. (Et oui, cela entre en conflit avec la documentation ici .)

Mise en garde: j'ai appris ce qui précède (au moment de la rédaction de cet article, début août 2019) en effectuant un test sur mon système local avec un référentiel réel, puis en effectuant une comparaison fichier par fichier des résultats. Mais! J'apprends encore, alors il pourrait y avoir un moyen plus correct. Mais mes tests m'ont aidé à conclure que le n ° 1 est ma méthode préférée actuellement.

2
V. Wheeler