Repozytorium klonowania GIT w lokalnym systemie plików w systemie Windows


200

Jestem kompletnym Noobem, jeśli chodzi o GIT. Właśnie stawiam pierwsze kroki w ciągu ostatnich kilku dni. Zainstalowałem repo na moim laptopie, ściągnąłem Trunk z projektu SVN (miałem problemy z gałęziami, nie działałem), ale wszystko wydaje się w porządku.

Chcę teraz móc ciągnąć lub pchać z laptopa na główny pulpit. Powodem jest to, że laptop jest przydatny w pociągu, ponieważ spędzam 2 godziny dziennie w podróży i mogę wykonać dobrą robotę. Ale moja główna maszyna w domu jest świetna do programowania. Więc chcę móc pchać / ciągnąć z laptopa na komputer główny, kiedy wrócę do domu. Pomyślałem, że najprostszym sposobem jest udostępnienie folderu kodu w sieci LAN i wykonanie:

git clone file://192.168.10.51/code

niestety nie wydaje mi się to działać:

więc otwieram cmd git bash i wpisuję powyższe polecenie, jestem w C: \ code (folder współdzielony dla obu komputerów) to, co otrzymuję:

Initialized empty Git repository in C:/code/code/.git/
fatal: 'C:/Program Files (x86)/Git/code' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Jak mogę udostępnić repozytorium między dwoma komputerami w najprostszy sposób.

Będą inne lokalizacje, które będą oficjalnymi punktami przechowywania i miejscami, z których będą pobierać inni deweloperzy i serwer CI itp. To jest po prostu, że mogę pracować na tym samym repozytorium na dwóch komputerach.

Zgodnie z sugestią Sebastiana otrzymuję:

C:\code>git clone --no-hardlinks file://192.168.10.51/code
Initialized empty Git repository in C:/code/code/.git/
fatal: 'C:/Program Files (x86)/Git/code' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

** EDYCJA - ODPOWIEDŹ **

Dzięki wszystkim, którzy pomogli. Próbowałem mapować dysk i działało, więc pomyślałem, że wrócę i spróbuję ponownie bez mapowania. Ostateczny wynik to:

git clone file://\\\\192.168.0.51\code

To działało świetnie.

Dzięki


plik: //192.168.10.51/code w żadnym wypadku nie jest poprawnym identyfikatorem URI wskazującym plik, podczas gdy plik: // C: \ foo \ bar.txt jest
Gregory Pakosz

Jak więc mogę wskazać zdalną maszynę z takim odniesieniem?
Jon

Prawdopodobnie chcesz zmapować dysk sieciowy.
Josh Lee

działało dla mnie - zwróć uwagę, że jest to specyficzne dla systemu Windows i nie działa z git bash w systemie Windows - trzeba użyć cmd lub PowerShell
Dave Rael

próbowałem też w cmd, ale nie działa. A także co oznacza „kod” w „pliku git clone: ​​// \\\\ 192.168.0.51 \ code”? Zamieniłem go na „C: / UniserverZ / www / sampleProject /” i to nie zadziałało. Powiedział, że nie jest to repozytorium git
boi_echos

Odpowiedzi:


177

Możesz określić adres URL pilota, stosując ścieżkę UNC do protokołu pliku. Wymaga to użycia czterech ukośników:

git clone file:////<host>/<share>/<path>

Na przykład, jeśli twój główny komputer ma adres IP 192.168.10.51 i nazwę komputera main, i ma nazwany udział, codektóry sam jest repozytorium git, wówczas oba poniższe polecenia powinny działać jednakowo:

git clone file:////main/code
git clone file:////192.168.10.51/code

Jeśli repozytorium Git znajduje się w podkatalogu, wystarczy dołączyć ścieżkę:

git clone file:////main/code/project-repository
git clone file:////192.168.10.51/code/project-repository

2
czy istnieje sposób uwierzytelnienia (tj. nazwa użytkownika / hasło) w tym schemacie?
intuicyjnie

1
@majgis Prawie używam tylko systemu Windows, więc moje rozwiązanie działa w systemie Windows.
poke

1
tak, to najlepszy sposób, aby to zrobić w systemie Windows.
Nicholas DiPiazza,

3
Można również użyć protokołu: //// użytkownik: hasło @ host: notacja portu / ścieżki , na przykład: plik: /// użytkownik:
hasło@192.168.10.51/code

1
@OderWat Tyle, że korzystanie z localhost wcale nie pomoże ci podczas próby uzyskania dostępu do innego komputera, o to właśnie chodziło. Jeśli chcesz uzyskać dostęp do lokalnego repozytorium, tj. Istniejącego lokalnie w twoim systemie plików, możesz po prostu użyć lokalnej ścieżki bez używania protokołu plików…
poke

125
$ git clone --no-hardlinks /path/to/repo

Powyższe polecenie używa notacji ścieżki POSIX dla katalogu z repozytorium git. W systemie Windows jest to (katalog C:/path/to/repozawiera .gitkatalog):

C:\some\dir\> git clone --local file:///C:/path/to/repo my_project

Repozytorium zostanie sklonowane C:\some\dir\my_project. Jeśli pominiesz file:///część, --localsugerowana jest opcja.


7
To działało dla mnie dla ścieżek plików ze spacjami: git clone -l plik: // "C: \ SOME PATH \ WITH SPACES" mój_projekt
Sebastian Patten

1
Świetna pomoc. Działa to dla mnie na moim komputerze z systemem Windows 7. <z wiersza polecenia git bash> coś takiego: plik git clone: ​​/// C: / Users / nazwa użytkownika / repsitoryName
Forhad

prawdopodobnie później będziesz chciał ustawić pilota. W przeciwnym razie wskazuje on na inne lokalne źródło jako źródło, które uważam za bardzo podatne na błędy. użyj git remote -v; git remote rm origin; git add origin <repo-address> (który możesz skopiować po wykonaniu git remote -v na oryginalnym lokalnym repozytorium)
Hanan

Jest to poprawne, nie musisz używać formularza URL takiego jak file: ////, możesz po prostu sklonować katalog.
Peter N. Steinmetz

14

odpowiedź z nazwą hosta nie działała dla mnie, ale zadziałało:

Plik git clone: ​​////home/git/repositories/MyProject.git/


1
Wygląda na to, że masz za dużo ukośników po „file:”. Dla mnie magiczną liczbą były 3 ukośniki
Mark F Guerra

Dziwne. Cztery ukośniki dały mi fatalny błąd. Działa (tylko dla mnie) z trzema.
Big McLargeHuge

4
Moją sztuczką, aby dowiedzieć się, która składnia działa, jest utworzenie pliku txt w folderze i przeciągnięcie go, aby otworzyć w przeglądarce. Pojawi się właściwy adres URL pliku.
AnneTheAgile,

7

Udało mi się to zrobić za pomocą file: //, ale z jednym dodatkowym ukośnikiem oznaczającym ścieżkę bezwzględną.

git clone file:///cygdrive/c/path/to/repository/

W moim przypadku używam Git na Cygwin dla Windows, co widać dzięki części / cygdrive / c na moich ścieżkach. Po drobnych poprawkach na ścieżce powinien działać z każdą instalacją git.

Dodanie pilota działa w ten sam sposób

git remote add remotename file:///cygdrive/c/path/to/repository/

6

Może zamapować udział jako dysk sieciowy, a następnie zrobić

git clone Z:\

Głównie tylko przypuszczenie; Zawsze robię to za pomocą ssh. Postępowanie zgodnie z tą sugestią będzie oznaczało, że będziesz musiał zmapować ten dysk za każdym razem, gdy naciskasz / ciągniesz do / z laptopa. Nie jestem pewien, jak ustawiasz ssh do pracy pod oknami, ale jeśli zamierzasz to robić dużo, być może warto to zbadać.


@Carlos: Myślę, że to zadziała tylko wtedy, gdy nie masz dostępu cddo innego katalogu na Z:dysku. IIRC; Od dłuższego czasu nie jestem użytkownikiem systemu Windows. Możliwe też, że gitinterpretuje litery dysków inaczej niż standardowa konwencja systemu Windows. Czy próbowałeś `Z:`?
intuicyjnie

errr ... powinien był przeczytać „próbowałeś„ Z: \ `?”. No cóż, z wyjątkiem poprawnego ucieczki, aby tryb kodu został włączony .. #nurrrr .. W każdym razie nie.
intuicyjnie

3

Nie jestem pewien, czy to z powodu mojej wersji git (1.7.2) czy co, ale powyższe podejścia przy użyciu nazwy komputera i opcji IP nie działały dla mnie. Dodatkowym szczegółem, który może / może nie być ważny, jest to, że repozytorium było nagim repozytorium, które zainicjowałem i wypchnąłem z innej maszyny.

Próbowałem sklonować projekt 1 zgodnie z zaleceniami powyżej za pomocą poleceń takich jak:

$ git clone file:////<IP_ADDRESS>/home/user/git/project1
Cloning into project1...
fatal: '//<IP_ADDRESS>/home/user/git/project1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

i

$ git clone file:////<MACHINE_NAME>/home/user/git/project1
Cloning into project1...
fatal: '//<MACHINE_NAME>/home/user/git/project1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Co zrobiłem pracę dla mnie było coś prostsze:

$ git clone ../git/project1
Cloning into project1...
done.

Uwaga - mimo że klonowane repozytorium było puste, utworzyło to „normalny” klon ze wszystkimi rzeczywistymi plikami kodu / obrazu / zasobów, na które liczyłem (w przeciwieństwie do wewnętrznych elementów repozytorium git).


1

Wprowadź ścieżki bezwzględne lub ścieżki względne.

Na przykład pierwsza poniżej wykorzystuje ścieżki bezwzględne:

(pochodzi z folderu zawierającego repozytorium i kopię zapasową jako podfoldery. pamiętaj również, że folder kopii zapasowej nie jest modyfikowany, jeśli już coś zawiera. a jeśli go nie ma, zostanie utworzony nowy folder)

~/git$ git clone --no-hardlinks ~/git/git_test1/   ~/git/bkp_repos/

Następujące używa ścieżek względnych:

~/git$ git clone --no-hardlinks git_test1/   bkp_repos2/

0

Chociaż ścieżka UNC jest obsługiwana od Gita 2.21 (luty 2019, patrz poniżej), Git 2.24 (IV kwartał 2019) pozwoli

git clone file://192.168.10.51/code

Nie więcej file:////xxxfile://wystarczy, aby odwołać się do udziału ścieżki UNC.
Zobacz „ Błąd pobierania Git z UNC ”.


Uwaga: od 2016 roku i MingW-64 w git.exe pakiecie z Git dla Windows obsługiwana jest ścieżka UNC.
(Patrz „W jaki sposób msys, msys2 i MinGW-64 są ze sobą powiązane? ”)

A w Git 2.21 (luty 2019 r.) Ta obsługa rozszerza się nawet w msys2 powłoce (z cudzysłowami wokół ścieżki UNC).

Zobacz zatwierdzenie 9e9da23 , zatwierdzenie 5440df4 (17 stycznia 2019 r.) Autor: Johannes Schindelin ( dscho) .
Pomagał: Kim Gybels ( Jeff-G) .
(Połączone przez Junio ​​C Hamano - gitster- w commit f5dd919 , 05 lutego 2019)

W wersjach wcześniejszych niż Git 2.21, z powodu dziwactwa w metodzie odradzania się Gita git-upload-pack, występuje problem z przekazywaniem ścieżek z odwrotnymi ukośnikami: Git zmusza linię poleceń przez powłokę, która ma inną semantykę cytowania w Git dla Windows (jest MSYS2 program) niż zwykłe pliki wykonywalne Win32, takie jakgit.exe sam.

Objawem jest to, że pierwszy z dwóch ukośników w UNC ścieżek postaci \\myserver\folder\repository.gitjest odpędzono .

Zostało to teraz złagodzone:

mingw: argumenty specjalnego przypadku do sh

Środowisko wykonawcze MSYS2 dokłada wszelkich starań, aby emulować rozszerzanie i usuwanie cudzysłowu z wiersza poleceń, które byłoby wykonywane przez wywoływanie powłoki uniksowej w systemach uniksowych.

Te reguły cytowania powłoki uniksowej różnią się od reguł cytowania odnoszących się do cmd Windows i PowerShell, co sprawia, że ​​trochę niewygodne jest prawidłowe podawanie parametrów wiersza poleceń podczas odradzania innych procesów.

W szczególności git.exeprzekazuje argumenty do podprocesów, które nie mają być interpretowane jako symbole wieloznaczne, a jeśli zawierają ukośniki odwrotne, nie należy ich interpretować jako znaków zmiany znaczenia, np. Podczas przechodzenia ścieżek systemu Windows.

Uwaga: jest to problem tylko podczas wywoływania plików wykonywalnych MSYS2, a nie podczas wywoływania plików wykonywalnych MINGW, takich jak git.exe. Jednak często wywołujemy pliki wykonywalne MSYS2, zwłaszcza podczas ustawianiause_shell flagi w strukturze child_process.

Nie ma eleganckiego sposobu na określenie, czy .exeplik do wykonania jest programem MSYS2 czy MINGW.
Ponieważ jednak częste jest używanie linii poleceń przez powłokę, musimy obejść ten problem przynajmniej podczas wykonywania sh.exe.

Wprowadźmy brzydki, zakodowany na stałe test, czy argv[0]sh” i czy odnosi się on do MSYS2 Bash, aby ustalić, czy musimy cytować argumenty inaczej niż zwykle.

To wciąż nie rozwiązuje problemu całkowicie, ale przynajmniej jest to coś.

Nawiasem mówiąc, rozwiązuje to również problem, w którym git clone \\server\reponie powiodło się z powodu nieprawidłowej obsługi ukośników odwrotnych podczas przekazywania ścieżki dogit-upload-pack procesu.

Ponadto musimy zadbać o to, by zacytować nie tylko białe spacje i ukośniki odwrotne, ale także nawiasy klamrowe.
Ponieważ aliasy często przechodzą przez MSYS2 Bash, a aliasy często otrzymują parametry takie jak HEAD@{yesterday}, jest to naprawdę ważne.

Widzieć t/t5580-clone-push-unc.sh


0

Po klonowaniu push nie działał.

Rozwiązanie: w przypadku klonowania repozytorium otwórz folder .git i plik konfiguracyjny.

W przypadku wartości adresu URL zdalnego pochodzenia:

[remote "origin"]
    url = file:///C:/Documentation/git_server/kurmisoftware
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.