GIT nhân bản repo trên hệ thống tệp cục bộ trong windows


200

Tôi là một Noob hoàn chỉnh khi nói đến GIT. Tôi chỉ mới thực hiện những bước đầu tiên của tôi trong vài ngày qua. Tôi thiết lập một repo trên máy tính xách tay của mình, kéo Trunk xuống từ một dự án SVN (có một số vấn đề với các chi nhánh, không khiến chúng hoạt động), nhưng tất cả có vẻ ổn ở đó.

Bây giờ tôi muốn có thể kéo hoặc đẩy từ máy tính xách tay đến máy tính để bàn chính của mình. Lý do là máy tính xách tay rất tiện dụng trên tàu vì tôi dành 2 giờ mỗi ngày để đi du lịch và có thể hoàn thành tốt công việc. Nhưng máy chính của tôi ở nhà là tuyệt vời để phát triển. Vì vậy, tôi muốn có thể đẩy / kéo từ máy tính xách tay sang máy tính chính khi tôi về nhà. Tôi nghĩ cách đơn giản nhất để làm điều này là chỉ cần chia sẻ thư mục mã trên mạng LAN và làm:

git clone file://192.168.10.51/code

Thật không may, điều này dường như không làm việc cho tôi:

Vì vậy, tôi mở một git bash cmd và gõ lệnh trên, tôi đang ở C: \ code (thư mục dùng chung cho cả hai máy) đây là những gì tôi nhận được:

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

Làm cách nào tôi có thể chia sẻ kho lưu trữ giữa hai máy theo những cách đơn giản nhất.

Sẽ có các vị trí khác sẽ là các điểm lưu trữ chính thức và các vị trí mà các nhà phát triển và máy chủ CI khác sẽ lấy từ đó, điều này chỉ để tôi có thể làm việc trên cùng một repo trên hai máy.

Theo đề nghị của Sebastian, tôi nhận được như sau:

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

** CHỈNH SỬA - TRẢ LỜI **

Cảm ơn tất cả những gì đã giúp đỡ. Tôi đã thử lập bản đồ một ổ đĩa và nó đã hoạt động nên tôi nghĩ rằng tôi sẽ quay lại và thử lại mà không cần ánh xạ. Kết quả cuối cùng là:

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

Điều này đã làm việc tuyệt vời.

Cảm ơn


tệp: //192.168.10.51/code hoàn toàn không phải là một URI hợp lệ trỏ đến một tệp, trong khi tệp: // C: \ foo \ bar.txt là
Gregory Pakosz

Sau đó, làm thế nào tôi có thể chỉ vào một máy từ xa với tham chiếu như vậy?
Jon

Bạn có thể muốn ánh xạ một ổ đĩa mạng.
Josh Lee

làm việc cho tôi - lưu ý điều này là dành riêng cho windows và sẽ không hoạt động từ git bash trong windows - cần sử dụng cmd hoặc powershell
Dave Rael

cũng đã thử nó trong cmd nhưng nó không hoạt động. Và "mã" trong "git clone" là gì: // \\\\ 192.168.0.51 \ code "nghĩa là gì? Tôi đã thay thế nó bằng "C: / UniserverZ / www / sampleProject /" và nó không hoạt động. Nó nói rằng nó không phải là một kho lưu trữ git
boi_echos

Câu trả lời:


177

Bạn có thể chỉ định URL của điều khiển từ xa bằng cách áp dụng đường dẫn UNC cho giao thức tệp. Điều này đòi hỏi bạn phải sử dụng bốn dấu gạch chéo:

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

Ví dụ: nếu máy chính của bạn có IP 192.168.10.51 và tên máy tính mainvà nó có một chia sẻ có tên codelà kho lưu trữ git, thì cả hai lệnh sau sẽ hoạt động như nhau:

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

Nếu kho Git nằm trong thư mục con, chỉ cần nối thêm đường dẫn:

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

2
Có cách nào để xác thực (tức là tên người dùng / mật khẩu) với lược đồ đó không?
trực giác

1
@majgis Tôi gần như chỉ sử dụng Windows, vì vậy giải pháp của tôi hoạt động cho Windows.
chọc

1
vâng đây là cách tốt nhất để làm điều đó trong windows.
Nicholas DiP Square

3
Người ta cũng có thể sử dụng giao thức: //// user: password @ host: port / path ký hiệu, ví dụ: file: /// user: password@192.168.10.51/code
pistache

1
@OderWat Ngoại trừ việc sử dụng localhost sẽ không giúp ích gì cho bạn khi cố gắng truy cập vào một máy tính khác, đó là câu hỏi gì. Nếu bạn muốn truy cập vào một kho lưu trữ cục bộ , tức là tồn tại cục bộ trong hệ thống tệp của bạn, bạn chỉ có thể sử dụng một đường dẫn cục bộ mà không cần sử dụng giao thức tập tin
chọc vào

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

Lệnh trên sử dụng ký hiệu đường dẫn POSIX cho thư mục với kho git của bạn. Đối với Windows, đó là (thư mục C:/path/to/repochứa .gitthư mục):

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

Các kho lưu trữ sẽ được sao chép C:\some\dir\my_project. Nếu bạn bỏ qua file:///một phần thì --localtùy chọn được ngụ ý.


7
Điều này làm việc cho tôi đối với các đường dẫn tệp có dấu cách: git clone -l tệp: // "C: \ MỘT SỐ ĐƯỜNG \ VỚI SPACES" my_project
Sebastian Patten

1
Giúp đỡ nhiều. Điều này hoạt động với tôi trong máy windows 7 của tôi. <Từ dấu nhắc lệnh git bash> đại loại như: git clone file: /// C: / Users / username / repsectiveName
Forhad

bạn có thể sẽ muốn đặt điều khiển từ xa sau đó .. nếu không, nó trỏ đến địa phương khác của bạn là nguồn gốc mà tôi thấy siêu dễ bị lỗi. sử dụng git remote -v; git remote rm origin; git add origin <repo-address> (mà bạn có thể sao chép sau khi thực hiện git remote -v trên repo cục bộ gốc)
Hanan

Điều này là chính xác, bạn không cần phải sử dụng một dạng url như tệp: ////, bạn chỉ có thể sao chép một thư mục.
Peter N. Steinmetz

14

câu trả lời với tên máy chủ không hiệu quả với tôi nhưng điều này đã làm:

tập tin git clone: ​​////home/git/repose khu / MyProject.git /


1
Có vẻ như bạn có quá nhiều dấu gạch chéo sau "file:". Đối với tôi, số ma thuật là 3 nhát chém
Mark F Guerra

Kỳ dị. Bốn nhát chém đã cho tôi một lỗi nghiêm trọng. Nó chỉ làm việc (đối với tôi) với ba.
Big McLargeHuge

4
Mẹo của tôi để tìm ra cú pháp hoạt động là tạo một tệp txt trong thư mục và kéo nó để mở trong trình duyệt. Các url bên phải cho một tập tin xuất hiện.
AnneTheAgile

7

Tôi đã thành công khi làm điều này bằng cách sử dụng tệp: //, nhưng với một dấu gạch chéo bổ sung để biểu thị một đường dẫn tuyệt đối.

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

Trong trường hợp của tôi, tôi đang sử dụng Git trên Cygwin cho Windows, bạn có thể thấy do phần / cygdrive / c trong đường dẫn của tôi. Với một số điều chỉnh theo đường dẫn, nó sẽ hoạt động với bất kỳ cài đặt git nào.

Thêm một điều khiển từ xa hoạt động theo cùng một cách

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

6

Có thể ánh xạ chia sẻ dưới dạng một ổ đĩa mạng và sau đó làm

git clone Z:\

Chủ yếu chỉ là phỏng đoán; Tôi luôn luôn làm những thứ này bằng cách sử dụng ssh. Theo sau sự cố đó tất nhiên sẽ có nghĩa là bạn sẽ cần phải có ổ đĩa đó được ánh xạ mỗi khi bạn đẩy / kéo đến / từ máy tính xách tay. Tôi không chắc chắn làm thế nào bạn tăng ssh để làm việc dưới cửa sổ nhưng nếu bạn sẽ làm điều này rất nhiều thì có thể đáng để điều tra.


@Carlos: Tôi nghĩ rằng nó sẽ chỉ hoạt động nếu bạn chưa cdđến một số thư mục khác trên Z:ổ đĩa. IIRC; Tôi đã không phải là một người dùng Windows trong một thời gian khá lâu. Ngoài ra, nó có thể là gitthông dịch ổ đĩa khác với quy ước Windows tiêu chuẩn. Bạn đã thử `Z:`?
trực giác

errr ... đáng lẽ nên đọc "bạn đã thử` Z: \`? ". Chà, ngoại trừ việc thoát chính xác để chế độ mã được bật .. #nurrrr .. dù sao thì tôi cũng đoán là không.
trực giác

3

Không chắc đó là do phiên bản git của tôi (1.7.2) hay gì, nhưng các cách tiếp cận được liệt kê ở trên sử dụng tên máy và tùy chọn IP không hoạt động với tôi. Một chi tiết bổ sung có thể / có thể không quan trọng là repo là một repo trần mà tôi đã khởi tạo và được đẩy đến từ một máy khác.

Tôi đã cố gắng sao chép dự án1 như đã khuyên ở trên với các lệnh như:

$ 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

$ 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

Những gì đã làm cho tôi là một cái gì đó đơn giản hơn:

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

Lưu ý - mặc dù repo được sao chép từ trần, nhưng điều này đã tạo ra một bản sao 'bình thường' với tất cả các tệp mã / hình ảnh / tài nguyên thực tế mà tôi đang hy vọng (trái ngược với nội bộ của git repo).


1

Hoặc nhập đường dẫn tuyệt đối hoặc đường dẫn tương đối.

Ví dụ: cái đầu tiên bên dưới sử dụng các đường dẫn tuyệt đối:

(đây là từ bên trong thư mục chứa kho lưu trữ và bản sao lưu dưới dạng thư mục con. Cũng nhớ rằng thư mục sao lưu không được sửa đổi nếu nó đã chứa bất cứ thứ gì. Nếu không có, thư mục mới sẽ được tạo)

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

Sau đây sử dụng các đường dẫn tương đối:

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

0

Trong khi đường dẫn UNC được hỗ trợ kể từ Git 2.21 (tháng 2 năm 2019, xem bên dưới), Git 2.24 (Q4 2019) sẽ cho phép

git clone file://192.168.10.51/code

Không còn nữa file:////xxx, ' file://' là đủ để đề cập đến chia sẻ đường dẫn UNC.
Xem " Lỗi tìm nạp Git với UNC ".


Lưu ý, kể từ năm 2016 và MingW-64 git.exe được đóng gói với Git cho Windows , đường dẫn UNC được hỗ trợ.
(Xem phần " msys, msys2 và MinGW-64 liên quan với nhau như thế nào? ")

Và với Git 2.21 (tháng 2 năm 2019), hỗ trợ này mở rộng ngay cả trong vỏ msys2 (với các trích dẫn xung quanh đường dẫn UNC).

Xem cam kết 9e9da23 , cam kết 5440df4 (17 tháng 1 năm 2019) của Johannes Schindelin ( dscho) .
Giúp đỡ: Kim Gybels ( Jeff-G) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết f5dd919 , ngày 5 tháng 2 năm 2019)

Trước Git 2.21, do phương pháp của Git không được sinh ra git-upload-pack, có một vấn đề khi truyền các đường dẫn có dấu gạch chéo ngược trong đó: Git sẽ buộc dòng lệnh qua shell, có ngữ nghĩa trích dẫn khác nhau trong Git cho Windows (là MSYS2 chương trình) hơn các chương trình thực thi Win32 thông thường như git.exechính nó.

Các triệu chứng là người đầu tiên của hai backslashes trong đường dẫn UNC có dạng \\myserver\folder\repository.gitđược cởi .

Điều này được giảm nhẹ ngay bây giờ:

mingw: đối số trường hợp đặc biệt để sh

Thời gian chạy MSYS2 làm hết sức mình để mô phỏng việc mở rộng và trích dẫn ký tự đại diện dòng lệnh sẽ được thực hiện bằng cách gọi shell Unix trên các hệ thống Unix.

Các quy tắc trích dẫn shell Unix này khác với các quy tắc trích dẫn áp dụng cho cmd và Powershell của Windows, khiến cho việc trích dẫn các tham số dòng lệnh đúng cách khi sinh ra các quy trình khác là điều hơi khó xử.

Đặc biệt, git.exe chuyển các đối số cho các quy trình con không được hiểu là ký tự đại diện và nếu chúng chứa dấu gạch chéo ngược, chúng không được hiểu là các ký tự thoát, ví dụ như khi đi qua các đường dẫn Windows.

Lưu ý: đây chỉ là sự cố khi gọi tệp thực thi MSYS2, không phải khi gọi tệp thực thi MINGW như git.exe. Tuy nhiên, chúng tôi gọi các tệp thực thi MSYS2 thường xuyên, đáng chú ý nhất là khi đặt use_shellcờ trong cấu trúc child_ process.

Không có cách nào tinh tế để xác định xem .exetệp sẽ được thực thi là chương trình MSYS2 hay MINGW.
Nhưng vì trường hợp sử dụng chuyển một dòng lệnh qua shell rất phổ biến, chúng ta cần phải khắc phục vấn đề này ít nhất là khi thực thi sh.exe.

Hãy giới thiệu một thử nghiệm xấu, mã hóa cho dù argv[0] là " sh" và liệu nó có đề cập đến MSYS2 Bash hay không, để xác định xem chúng ta có cần trích dẫn các đối số khác nhau hơn bình thường hay không.

Điều đó vẫn không khắc phục hoàn toàn vấn đề, nhưng ít nhất nó là một cái gì đó.

Ngẫu nhiên, điều này cũng khắc phục sự cố git clone \\server\repokhông thành công do xử lý dấu gạch chéo ngược không chính xác khi bàn giao đường dẫn đếngit-upload-pack quy trình.

Hơn nữa, chúng ta cần lưu ý để trích dẫn không chỉ khoảng trắng và dấu gạch chéo ngược, mà cả dấu ngoặc nhọn.
Vì các bí danh thường xuyên đi qua MSYS2 Bash và vì các bí danh thường xuyên nhận được các tham số như HEAD@{yesterday}, điều này thực sự quan trọng.

Xem t/t5580-clone-push-unc.sh


0

Sau khi nhân bản, đối với tôi đẩy không hoạt động.

Giải pháp: Trường hợp repo được sao chép mở thư mục .git và tệp cấu hình.

Đối với giá trị thiết lập url nguồn gốc từ xa:

[remote "origin"]
    url = file:///C:/Documentation/git_server/kurmisoftware
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.