Comment puis-je rendre mon dépôt local disponible pour git-pull?

89

J'ai un référentiel de copies de travail sur lequel je travaille sans problème; l'origine de ce référentiel est sur GitHub.

Je voudrais rendre mon référentiel de copie de travail disponible comme origine de ma machine de construction (une VM sur un autre hôte physique), afin que les validations que je fais sur ma copie de travail puissent être construites et testées sur la machine de construction sans avoir à passer par GitHub d'abord. J'ai déjà une compilation pour le dépôt GitHub, mais j'aimerais que ce soit un dépôt / construction "en or"; c'est-à-dire que si quelque chose se passe là-dedans, la construction contre GitHub devrait être garantie de réussir.

J'ai regardé la documentation sur les URL Git, et j'ai vu qu'il y a la possibilité d'utiliser une URL dans le formulaire git://host.xz[:port]/path/to/repo.git/(voir, par exemple, la documentation git-clone ). Je veux faire cela de la manière la plus simple possible, avec le minimum de configuration: je ne veux pas avoir à configurer un démon SSH ou un serveur Web juste pour le publier sur ma machine de construction.

J'utilise Windows 7 x64 RC, MSysGit et TortoiseGit sont installés et j'ai ouvert le port par défaut de Git (9814) sur le pare-feu. Veuillez supposer que le dépôt de la copie de travail est à D:\Visual Studio Projects\MyGitRepo, et le nom d'hôte est devbox. La machine de construction est Windows Server 2008 x64. J'ai essayé la commande suivante sur la machine de construction, avec la sortie associée:

D:\Integration>git clone "git://devbox/D:\Visual Studio Projects\MyGitRepo"
Initialized empty Git repository in D:/Integration/MyGitRepo/.git/
devbox[0: 192.168.0.2]: errno=No error
fatal: unable to connect a socket (No error)

Est-ce que je manque quelque chose?

alastairs
la source
Ne pouvez-vous pas simplement configurer un partage localement, puis faire 'git clone \\ workmachine \ share' à partir de votre buildmachine? Pas la meilleure / la plus efficace, mais la chose la plus simple à faire.
Joakim Elofsson

Réponses:

133

Il existe cinq possibilités pour configurer un référentiel pour l'extraction depuis:

  • système de fichiers local : git clone /path/to/repoou git clone file://path/to/repo. Moins de travail si vous avez un système de fichiers en réseau, mais pas une utilisation très efficace du réseau. (C'est presque exactement la solution proposée par Joakim Elofsson )
  • Protocoles HTTP : git clone http://example.com/repo. Vous avez besoin de n'importe quel serveur Web, et vous devez également exécuter (peut-être automatiquement, à partir d'un hook) git-update-server-info pour générer les informations nécessaires à la récupération / extraction via des protocoles "stupides".
  • SSH : git clone ssh://example.com/srv/git/repoou git clone example.com:/srv/git/repo. Vous devez configurer le serveur SSH (démon SSH) et avoir SSH installé sur le client (par exemple PuTTY sous MS Windows).
  • protocole git : git clone git://example.com/repo. Vous devez exécuter git-daemon sur le serveur; voir la documentation pour plus de détails (vous pouvez l'exécuter en tant que processus autonome uniquement pour la récupération, pas nécessairement exécuter en tant que service). git-daemon fait partie de git.
  • bundle : vous générez le bundle sur le serveur à l'aide de la commande git-bundle , le transférez sur une machine cliente de quelque manière que ce soit (même via USB) et clonez en utilisant git clone file.bndl(si le clone ne fonctionne pas, vous pouvez faire "git init", "git remote add "et" git fetch ").

Ce qui vous manque dans votre exemple est probablement l'exécution de git-daemon sur le serveur. Cela, ou une mauvaise configuration de git-daemon.

Malheureusement, je ne peux pas vous aider à exécuter git-daemon en tant que service sur MS Windows. Il n'y a rien dans l'annonce de la dernière version de msysGit à propos de git-daemon ne fonctionnant pas, cependant.

Jakub Narębski
la source
Ok, donc je dois installer quelque chose ou le copier sur un bundle manuellement à chaque fois (éventuellement en le scriptant via, je suppose. Les trois premières options nécessitent-elles également git-daemon?
alastairs
1
Seule l'option "git protocol" nécessite l'exécution de git-daemon sur le serveur. Seules les options «SSH» et «HTTP» nécessitent des outils supplémentaires: sshd (serveur ssh) ou serveur Web. La solution groupée est une solution manuelle.
Jakub Narębski
Bien que la question porte sur «pull», l'affiche doit être avertie de ne pas exécuter «git push» par la suite, car le référentiel à partir duquel il clonage n'est pas nu.
yhager le
Pouvez-vous nous en dire plus, @yhager?
alastairs le
1
Note à tous ceux qui essaient l'option du système de fichiers local: n'oubliez pas d'échapper aux antislashs principaux sur le chemin UNC! :-)
alastairs
17

En plus des réponses de Jakub Narębski, il existe une autre manière, plus en phase avec votre question initiale. Vous pouvez cloner à partir de github comme vous le faites habituellement, puis lorsque vous souhaitez effectuer une extraction unique à partir de votre dépôt local, procédez comme suit:

git pull /path/to/repo master

(au lieu de master, vous pouvez mettre n'importe quel nom de branche.)

Cosse
la source
Un petit conseil (ou comment je suis arrivé à cette question): ..dans <chemin / vers / repo> ne semble pas fonctionner; utilisez plutôt un chemin complet.
Dmitry Timofeev
1

J'ai récemment modifié l'un de mes projets git pour se répliquer sur un serveur HTTP en utilisant sitecopy pour effectuer les téléchargements de fichiers réels.

C'est assez facile, il suffit d'utiliser git update-server-info puis de mettre en miroir le répertoire .git dans un répertoire accessible via http sur votre serveur. J'ai utilisé «project.git», ce qui est assez courant.

Git pull de http: // site / project-git fonctionne comme un champion, et je n'ai rien besoin d'avoir sur le serveur sauf l'accès FTP, bien que sitecopy supporte également webdav.

Cependant, je ne recommande pas d'utiliser la copie de site, car elle ne permet pas de synchroniser correctement plusieurs machines. Pour mon projet, le référentiel HTTP est en lecture seule, et les mises à jour Gold proviennent d'une seule machine, donc cela fonctionne assez bien.

davenpcj
la source
1

Si vous avez un chemin comme

C:\Project\

et vous l'avez git initdéjà fait, vous avez donc également un dossier

C:\Project\.git\

Vous créez maintenant un nouveau dossier

C:\.git\

Allez dans ce dossier et exécutez git clone --bare ..\Project( bare is important),
retournez dans votre C:\Project\dossier et faites un git remote add-url local ..\.git\Project.
Maintenant tu fais juste git add -A, git commit -m "HelloWorld"etgit push local master .

Vous pouvez partager le Projectdossier, le connecter Z:et le faire git clone Z:\Project- vous pouvez l'utiliser maintenant git pull origin masteret git push origin masterpousser / extraire les modifications d'un ordinateur à un autre.

métadings
la source
0

Si votre hôte distant est dans le même réseau Windows, c'est-à-dire que vous pouvez y accéder en tant que \ remotehost, vous pouvez mapper le lecteur réseau dans l'explorateur, disons z: -> \ remotehost \ repodir, après cela, vous pouvez utiliser 'git clone / z / myproject 'pour cloner le projet

jnr
la source