git clone qua ssh


233

Tôi có một dự án mà tôi đã tạo một kho git:

$ cd myproject  
$ git init  
$ git add .  
$ git commit  

Tôi muốn tạo một bản sao trần trên một máy khác:

$ cd ..  
$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git  

Tôi đã thực hiện bản sao nhưng không in bất kỳ câu trả lời. Tôi đã đăng nhập vào máy chủ và thử xem các tệp được lưu trữ như thế nào. Đường dẫn / GitRepos trống, vì vậy tôi quyết định thực hiện lại bản sao:

$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git

Lần này câu trả lời là:

fatal: Destination path 'ssh: // user @ server: /GitRepos/myproject.git' đã tồn tại và không phải là một thư mục trống.

Nhưng tôi thấy rằng con đường trống rỗng.
Những gì đang xảy ra ở đây ?


Tôi không nghĩ chạy git clone --baresẽ làm những gì bạn nghĩ nó sẽ làm.
Wolfer

3
Đối với tôi, ssh: // đã tạo một thư mục, thay vì sử dụng giao thức từ xa. Có những thứ để làm việc bằng cách sử dụng câu trả lời của @ alec-the-geek. Bạn có phiền khi chọn một câu trả lời ưa thích cho việc này - đó là công việc của bạn.
akauppi 15/03/2015

1
@akauppi: Trách nhiệm của OP là xem xét tất cả các câu trả lời, nhưng họ không có nghĩa vụ phải chọn một câu trả lời cho đến khi họ hài lòng. (Tất nhiên, sẽ không hại khi nhắc nhở họ hoặc hỏi họ cần thêm thông tin gì để câu trả lời được họ chấp nhận!)
jvriesem

@jvriesem tất nhiên rồi. Sẽ loại bỏ "đó là công việc của bạn" bây giờ. Nhưng đó là một điều cũ ... :)
akauppi

Câu trả lời:


219

Điều này có thể không liên quan trực tiếp đến câu hỏi; nhưng một lỗi tôi tự mắc phải và tôi thấy trong OP, đó là thông số URL ssh://user@server:/GitRepos/myproject.git- cụ thể là, bạn có cả dấu hai chấm :và dấu gạch chéo về phía trước /sau khi nó biểu thị một đường dẫn tuyệt đối.

Sau đó tôi đã tìm thấy Git clone, ssh: Không thể giải quyết tên máy chủ - git, phát triển - Nicolas Kuttler (vì đó là lỗi tôi đã gặp, trên gitphiên bản 1.7.9.5), lưu ý:

Vấn đề với lệnh tôi đã sử dụng ban đầu là tôi đã cố gắng sử dụng cú pháp giống như scp.

... Đó cũng là vấn đề của tôi! Vì vậy, về cơ bản gitvới ssh, bạn hoặc sử dụng

  • ssh://username@host.xz/absolute/path/to/repo.git/ - chỉ là một dấu gạch chéo về phía trước cho đường dẫn tuyệt đối trên máy chủ
  • username@host.xz:relative/path/to/repo.git/- chỉ là dấu hai chấm (không phải có ssh://đường dẫn tương đối trên máy chủ (liên quan đến thư mục chính của usernamemáy chủ)

Hy vọng điều này sẽ giúp ai đó,
Chúc mừng!


84
Điều này không hoạt động. Nếu bạn muốn chỉ định một đường dẫn tương đối với ssh, bạn phải mất ssh://tiền tố. Tôi chỉ dành 20 phút để cố gắng tìm ra điều này. git clone username@host.xz:relative/path/to/repo.git/nên làm việc.
bobbaluba

2
Đã thử nó với git 2.1.4 trên Debian 8. Cả hai loại đường đều không hoạt động. Không có thư mục nào được tạo trong / GitRepos trong lần thử đầu tiên và trong lần thử thứ 2 đã phàn nàn rằng đường dẫn đã tồn tại. Giống như vấn đề ban đầu được báo cáo
dlsa

5
Vì nhận xét của bạn @bobbaluba (và câu trả lời được cập nhật), tôi cũng không phải dành 20 phút cho việc này. Cảm ơn!
olafure

143

Đối với các kho lưu trữ trên GitHub, hãy thử:

git clone ssh://git@github.com/<user>/<repository name>.git

Để thiết lập git để sao chép qua ssh, xem:


<user> tên người dùng của tôi trong github hoặc địa chỉ email của tôi cho github? bởi vì liên kết này gợi ý cho tôi sử dụng địa chỉ email trong quá trình tạo khóa chung. help.github.com/en/github/authenticating-to-github/, sau khi thử điều đó (cụm mật khẩu trống cho gen khóa ssh), tôi vẫn không thể sao chép repo từ github. ps Tôi đã không thêm chìa khóa cho các đại lý.
Minnie

công việc tương tự cho gitlab cũng vậy. trước đó, chúng tôi cần kích hoạt thiết lập khóa SSH, như bạn đã đề xuất
Venkataraman R

45

Bạn cần chạy lệnh clone trên những gì bạn đang gọi máy chủ. Nhưng tôi cá là bạn không chạy máy chủ ssh trên máy khách cục bộ để dù sao nó cũng không hoạt động. Đề nghị bạn làm theo phương pháp này (kiểm tra hướng dẫn vì tôi đang làm điều này từ bộ nhớ)

  1. Đăng nhập vào máy chủ.
  2. Tạo một repo trần bằng cách sử dụng git init --bare
  3. Trên máy khách, bạn có thể đẩy repo của mình đến máy chủ. git remote add origin ssh://user@server:/GitRepos/myproject.gittheo dõi bởigit push origin master

Lời khuyên tuyệt vời! Một số lưu ý cho những người mới (như tôi), những người chưa từng xử lý các thư mục máy chủ thuần túy trước đây: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git trước git init --bare. Bạn sẽ không nhận được một bản sao công việc ở đây - các tệp và thư mục repo (thường là .git) sẽ không có sẵn cho bạn, do đó là tên của cờ. Cảm ơn
akauppi 15/03/2015

2
"git init --bare" không tạo thư mục .git. Nó đặt các tập tin trực tiếp vào thư mục. Khi thêm nguồn gốc từ xa, tôi nhận được: "" fatal: Không phải là kho lưu trữ git (hoặc bất kỳ phụ huynh nào để gắn điểm / nhà) Dừng ở ranh giới hệ thống tập tin (GIT_DISCOVERY_ACROSS_FILESYSTEM không được đặt).
dlsa

10

Tuyên bố từ chối trách nhiệm: Đây chỉ là một bản sao của một nhận xét của bobbaluba được hiển thị rõ hơn cho khách truy cập trong tương lai. Nó giúp tôi nhiều hơn bất kỳ câu trả lời nào khác.


Bạn phải bỏ ssh://tiền tố khi sử dụng git clonelàm ví dụ

git clone git@github.com:owner/repo.git

5

thử cái này.

Bước 1:

ls -al ~/.ssh

nhập mô tả hình ảnh ở đây

Bước 2:

ssh-keygen 

(sử dụng phím enter cho giá trị mặc định) nhập mô tả hình ảnh ở đây Bước 3: Để thiết lập tệp cấu hình

vim /c/Users/Willie/.ssh/config

Máy chủ gitlab.com
HostName gitlab.com
tài git
IdentityFile ~ / .ssh / id_rsa

Bước 4:

git clone git@gitlab.com:<username>/test2.git

nhập mô tả hình ảnh ở đây

Bước 5:
Khi bạn hoàn thành Bước 4
1. tệp test2.git sẽ được tải xuống xong 2.
bạn sẽ nhận được tệp mới (know_hosts) trong ~ / .ssh
nhập mô tả hình ảnh ở đây

PS: Tôi tạo id_rsa và id_rsa.ub bằng meself và tôi gửi nó đến máy chủ Gitlab. sử dụng cả hai khóa cho bất kỳ phía máy khách nào (windows và Linux).


4

Git 101:

gitlà một hệ thống kiểm soát phiên bản phi tập trung. Bạn không cần một máy chủ để khởi động và chạy với git. Tuy nhiên, bạn có thể muốn làm điều đó vì nó trông mát mẻ, phải không? (Nó cũng hữu ích nếu bạn muốn làm việc trên một dự án từ nhiều máy tính.)

Vì vậy, để có được một "máy chủ" đang chạy, bạn cần chạy git init --bare <your_project>.gitvì điều này sẽ tạo ra một kho lưu trữ trống, sau đó bạn có thể nhập vào các máy của mình mà không phải lẩn quẩn trong các tệp cấu hình trong .gitthư mục của mình .

Sau này, bạn có thể sao chép repo trên máy khách của mình vì nó được cho là hoạt động, nhưng tôi thấy rằng một số khách hàng (cụ thể git-gui) sẽ không sao chép một repo hoàn toàn trống rỗng. Để làm việc xung quanh này, bạn cần phải chạy cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master. (Lưu ý rằng bạn có thể cần định cấu hình tên người dùng và email cho git của máy đó nếu trước đây bạn chưa làm như vậy. Các lệnh thực tế để chạy sẽ nằm trong thông báo lỗi bạn nhận được vì vậy tôi sẽ bỏ qua chúng.)

Vì vậy, tại thời điểm này, bạn có thể sao chép kho lưu trữ vào bất kỳ máy nào chỉ bằng cách chạy git clone <user>@<server>:<relative_path><your_project>.git. (Như những người khác đã chỉ ra rằng bạn có thể cần phải thêm tiền tố vào ssh://nếu bạn sử dụng đường dẫn tuyệt đối.) Điều này giả định rằng bạn đã có thể đăng nhập từ máy khách của mình đến máy chủ. (Bạn cũng sẽ nhận được điểm thưởng khi thiết lập tệp cấu hình và khóa ssh, nếu bạn có ý định đẩy nhiều thứ đến máy chủ từ xa.)

Một số liên kết có liên quan:
Điều này khá nhiều cho bạn biết những gì bạn cần biết.
Và điều này là dành cho những người biết các hoạt động cơ bản của git nhưng đôi khi quên cú pháp chính xác.


Cả hai liên kết bây giờ dường như đã chết hoặc không hiển thị những gì bạn mong đợi.
Todd

2

Tôi muốn thử một câu trả lời bao gồm luồng git và ba 'điểm' hoặc trường hợp sử dụng, kho lưu trữ trung tâm git, phát triển cục bộ và máy sản xuất. Điều này không được thử nghiệm tốt .

Tôi đang đưa ra các lệnh cực kỳ cụ thể. Thay vì nói <your folder>, tôi sẽ nói /root/git. Nơi duy nhất mà tôi đang thay đổi lệnh ban đầu là thay thế tên máy chủ cụ thể của tôi bằng example.com. Tôi sẽ giải thích mục đích thư mục là để bạn có thể điều chỉnh nó cho phù hợp. Xin vui lòng cho tôi biết bất kỳ sự nhầm lẫn và tôi sẽ cập nhật câu trả lời.

Phiên bản git trên máy chủ là 1.7.1. Máy chủ là CentOS 6.3 (Cuối cùng).

Phiên bản git trên máy phát triển là 1.8.1.1. Đây là Mac OS X 10.8.4.

Kho lưu trữ trung tâm và máy sản xuất nằm trên cùng một máy.

kho lưu trữ trung tâm mà người dùng svn có thể liên quan đến 'máy chủ' được định cấu hình như sau. Tôi có một thư mục /root/gitnơi tôi giữ tất cả các kho git của tôi. Tôi muốn tạo một kho git cho một dự án mà tôi gọi là 'hoa'.

cd /root/git
git clone --bare flowers flowers.git

Lệnh git đưa ra hai thông báo:

Initialized empty Git repository in /root/git/flowers.git/
warning: You appear to have cloned an empty repository.

Không có gì phải lo lắng về.

Trên máy phát triển được cấu hình như sau. Tôi có một thư mục /home/kinjal/Sitesnơi tôi đặt tất cả các dự án của tôi. Bây giờ tôi muốn có được kho git trung tâm.

cd /home/kinjal/Sites
git clone root@example.net:/root/git/flowers.git

Điều này đưa tôi đến một điểm mà tôi có thể bắt đầu thêm công cụ vào đó. Lần đầu tiên tôi thiết lập luồng git

git flow init -d

Theo mặc định, đây là trên chi nhánh develop. Tôi thêm mã của tôi ở đây, bây giờ. Sau đó, tôi cần phải cam kết với kho git trung tâm.

git add .
git commit -am 'initial'
git push

Lúc này nó đẩy sang nhánh phát triển. Tôi cũng muốn thêm nó vào nhánh chủ.

git flow release start v0.0.0 develop
git flow release finish v0.0.0
git push

Lưu ý rằng tôi không làm gì giữa bắt đầu phát hành và kết thúc phát hành. Và khi tôi hoàn thành việc phát hành, tôi được nhắc chỉnh sửa hai tập tin. Điều này đã đẩy chi nhánh phát triển lên thành thạo.

Trên trang sản xuất, trên cùng một máy với kho git trung tâm của tôi, tôi muốn đặt kho lưu trữ vào /var/www/vhosts/example.net. Tôi đã có /var/www/vhosts.

cd /var/www/vhosts
git clone file:///root/git/flowers.git example.net

Nếu máy sản xuất cũng sẽ ở trên một máy khác, git clonelệnh sẽ trông giống như máy được sử dụng trên máy phát triển.


1

Trước mắt, tôi hơi thiếu kỹ năng GIT của mình.

Điều đó sẽ sao chép một kho lưu trữ trần trên máy của bạn, nơi chỉ chứa các thư mục trong .gitđó là một thư mục ẩn. thực hiện ls -alvà bạn sẽ thấy .githoặccd .git bên trong kho lưu trữ của bạn.

Bạn có thể thêm một mô tả về ý định của bạn để ai đó có nhiều kỹ năng GIT có thể giúp đỡ không? Bạn thực sự muốn làm gì không như thế nào bạn có kế hoạch thực hiện nó?


Tôi hiểu sai lệnh. Những gì tôi đã làm là tạo một cây thư mục con ssh: /myproject.git trong thư mục hiện tại. Tôi nghĩ rằng tôi đã nhân bản vào một thư mục từ xa, nhưng những gì lệnh thực sự làm là sao chép từ một kho lưu trữ.
dlsa

0

Tôi đã: git clone không phải là một thư mục trống

Hệ thống đã tạo một thư mục ssh: // luc @ EERSTENASDS119J / volume1 / RepoA trong đường dẫn hiện tại của tôi.

Vì vậy, git clone đã không giải thích đặc tả URL. Đã sử dụng cách giải quyết của Alec.


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.