Làm thế nào để tạo một kho lưu trữ Git từ xa từ một địa phương?


243

Tôi có một kho Git cục bộ. Tôi muốn làm cho nó có sẵn trên một máy chủ từ xa, kích hoạt ssh. Làm thế nào để tôi làm điều này?

Câu trả lời:


287

Tôi nghĩ rằng bạn tạo một kho lưu trữ trống ở phía xa git init --bare, thêm phía từ xa làm trình theo dõi đẩy / kéo cho kho lưu trữ cục bộ của bạn ( git remote add origin URL), sau đó bạn chỉ cần nói cục bộ git push origin master. Bây giờ bất kỳ kho lưu trữ khác có thể pulltừ kho lưu trữ từ xa.


@Nips: vâng, đúng, xin lỗi. Bạn đẩy từng nhánh, thực sự!
Kerrek SB

Nếu tôi đang sử dụng GUI thì sao? Làm cách nào tôi có thể thiết lập một máy chủ cho tất cả kho lưu trữ và mỗi PC trên cùng một mạng kết nối với nó?
SearchForKnowledge

4
nếu git push origin masterkhông thành công với lỗi "kho lưu trữ không tìm thấy", hãy thử git update-server-infoở phía xa, nơi bạn đã làmgit init --bare
HongKilDong

7
@KerrekSB có thể tự động tạo một repo trần trên máy chủ ngay khi tôi chạy git push origin master trên địa phương của tôi
ANinJa

@HongKilDong Tôi đã thử git update-server-infonhưng tôi gặp lỗi fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
Nayef

81

Để thiết lập ban đầu bất kỳ máy chủ Git nào, bạn phải xuất kho lưu trữ hiện có sang kho lưu trữ mới - kho lưu trữ không chứa thư mục hoạt động. Điều này thường đơn giản để làm. Để sao chép kho lưu trữ của bạn để tạo một kho lưu trữ mới, bạn chạy lệnh clone với --baretùy chọn. Theo quy ước, các thư mục kho lưu trữ cuối cùng kết thúc .git, như vậy:

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

Lệnh này tự lưu trữ Git, không có thư mục làm việc và tạo một thư mục riêng cho nó.

Bây giờ bạn đã có một bản sao lưu trữ của kho lưu trữ của mình, tất cả những gì bạn cần làm là đặt nó trên một máy chủ và thiết lập các giao thức của bạn. Giả sử bạn đã thiết lập một máy chủ có tên là git.example.combạn có quyền truy cập SSH và bạn muốn lưu trữ tất cả các kho Git của mình trong /opt/gitthư mục. Bạn có thể thiết lập kho lưu trữ mới của mình bằng cách sao chép kho lưu trữ trần của bạn qua:

$ scp -r my_project.git user@git.example.com:/opt/git

Tại thời điểm này, những người dùng khác có quyền truy cập SSH vào cùng một máy chủ có quyền truy cập đọc vào /opt/gitthư mục có thể sao chép kho lưu trữ của bạn bằng cách chạy

$ git clone user@git.example.com:/opt/git/my_project.git

Nếu người dùng SSH vào máy chủ và có quyền ghi vào /opt/git/my_project.gitthư mục, họ cũng sẽ tự động có quyền truy cập đẩy. Git sẽ tự động thêm quyền ghi nhóm vào kho lưu trữ đúng cách nếu bạn chạy lệnh git init với --sharedtùy chọn.

$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared

Rất dễ dàng để có một kho lưu trữ Git, tạo một phiên bản trống và đặt nó trên một máy chủ mà bạn và các cộng tác viên của bạn có quyền truy cập SSH. Bây giờ bạn đã sẵn sàng để hợp tác trong cùng một dự án.


6
Các scpgiải pháp công trình IMO tốt hơn trong thực tế hơn init --bare. Nó vẫn cảm thấy một loại hack xấu xí mặc dù lần đầu tiên được sao chép cục bộ, sau đó sao chép vào máy chủ ... ước gì git có một lệnh để thực hiện nó trong một lần.
leftaroundabout

1
+ 1'd cái này vì --sharedlàm việc cho tôi. Tôi tự hỏi điều gì sẽ xảy ra nếu bạn sử dụng git init --sharedmà không tạo ra một --bare...
icedwater 10/11/2015

1
Tạo một kho lưu trữ cục bộ và scpđể một điều khiển từ xa hoạt động tốt hơn nếu điều khiển từ xa không hỗ trợ git init --bare(như trường hợp của tôi với git 1.5.5, 2008). Tôi nghĩ rằng nó sẽ hoạt động ngay cả khi điều khiển từ xa không có git nào cả.
Yaroslav Nikitenko


1
một lưu ý nhỏ: bước scp của giải pháp là đúng nhưng nó hoạt động nếu người dùng từ xa có shell thông thường, nếu người dùng sử dụng git-shell thì nó sẽ không hoạt động.
user1708042

9

Một lưu ý cho những người đã tạo bản sao cục bộ trên Windows và muốn tạo một kho lưu trữ từ xa tương ứng trên hệ thống dòng Unix, nơi các tệp văn bản nhận được kết thúc của LF trên các bản sao tiếp theo của các nhà phát triển trên các hệ thống giống Unix, nhưng kết thúc CRLF trên Windows.

Nếu bạn đã tạo kho lưu trữ Windows của mình trước khi thiết lập bản dịch kết thúc dòng thì bạn có vấn đề. Cài đặt mặc định của Git là không có bản dịch, vì vậy bộ làm việc của bạn sử dụng CRLF nhưng kho lưu trữ của bạn (tức là dữ liệu được lưu trữ trong .git) cũng đã lưu các tệp dưới dạng CRLF.

Khi bạn đẩy đến điều khiển từ xa, các tệp đã lưu được sao chép nguyên trạng, không có bản dịch kết thúc dòng nào xảy ra. (Dịch kết thúc dòng xảy ra khi các tệp được cam kết vào một kho lưu trữ, không phải khi các kho được đẩy). Bạn kết thúc với CRLF trong kho lưu trữ giống Unix của bạn, đây không phải là điều bạn muốn.

Để có được LF trong kho lưu trữ từ xa, trước tiên bạn phải đảm bảo rằng LF nằm trong kho lưu trữ cục bộ, bằng cách chuẩn hóa lại kho lưu trữ Windows của bạn . Điều này sẽ không có hiệu ứng rõ ràng trên bộ làm việc Windows của bạn, vẫn có kết thúc CRLF, tuy nhiên khi bạn đẩy sang điều khiển từ xa, điều khiển từ xa sẽ nhận được chính xác LF.

Tôi không chắc có cách nào dễ dàng để biết bạn có dòng kết thúc nào trong kho lưu trữ Windows của mình không - tôi đoán bạn có thể kiểm tra nó bằng cách đặt core.autocrlf = false và sau đó nhân bản (Nếu repo có kết thúc LF, bản sao sẽ có LF cũng vậy).


5

Có một sự khác biệt thú vị giữa hai giải pháp phổ biến ở trên:

  1. Nếu bạn tạo kho lưu trữ trần như thế này:

    cd / bên ngoài_of_any_Vpo
    mkdir my_remote.git
    cd my_remote.git
    git init --bare
    

và sau đó

cd  /your_path/original_repo
git remote add origin /outside_of_any_repo/my_remote.git
git push --set-upstream origin master

Sau đó, git sẽ thiết lập cấu hình trong 'gốc numpo' với mối quan hệ này:

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

với cái sau là điều khiển từ xa ngược dòng. Và điều khiển từ xa ngược dòng không có bất kỳ điều khiển từ xa nào khác trong cấu hình của nó.

  1. Tuy nhiên, nếu bạn làm theo cách khác:

    (từ trong thư mục gốc numpo)
    cd ..
    git clone --bare gốc_Vpo /outside_of_any_Vpo / my_remote.git
    

sau đó 'my_remote.git' kết thúc với cấu hình của nó có 'nguồn gốc' trỏ về 'gốc numpo' dưới dạng điều khiển từ xa, với remote.origin.url tương đương với đường dẫn thư mục cục bộ, có thể không phù hợp nếu nó sẽ được di chuyển đến một máy chủ.

Mặc dù tham chiếu "từ xa" đó rất dễ bị loại bỏ sau này nếu không phù hợp, 'gốc numpo' vẫn phải được thiết lập để trỏ đến 'my_remote.git' như một điều khiển từ xa ngược dòng (hoặc đến bất cứ nơi nào nó đi được chia sẻ từ). Vì vậy, về mặt kỹ thuật, bạn có thể đi đến cùng một kết quả với một vài bước nữa với cách tiếp cận # 2. Nhưng # 1 dường như là một cách tiếp cận trực tiếp hơn để tạo ra một "repo chia sẻ trần trung tâm" có nguồn gốc từ một địa phương, thích hợp để di chuyển đến một máy chủ, với ít bước hơn liên quan. Tôi nghĩ rằng nó phụ thuộc vào vai trò mà bạn muốn repo từ xa. (Và vâng, điều này mâu thuẫn với tài liệu ở đây .)

Hãy cẩn thận: Tôi đã học được những điều trên (tại bài viết này vào đầu tháng 8 năm 2019) bằng cách thực hiện một thử nghiệm trên hệ thống cục bộ của tôi với một repo thực sự, và sau đó thực hiện so sánh từng tệp giữa các kết quả. Nhưng! Tôi vẫn đang học, vì vậy có thể có một cách chính xác hơn. Nhưng các thử nghiệm của tôi đã giúp tôi kết luận rằng # 1 là phương pháp hiện đang được ưa thích của tôi.


4

Một kho lưu trữ từ xa nói chung là một kho lưu trữ trần - một kho lưu trữ Git không có thư mục làm việc. Bởi vì kho lưu trữ chỉ được sử dụng như một điểm cộng tác, không có lý do gì để có một ảnh chụp nhanh được kiểm tra trên đĩa; nó chỉ là dữ liệu Git. Nói một cách đơn giản nhất, một kho lưu trữ trần là nội dung của thư mục .git của dự án của bạn và không có gì khác.

Bạn có thể tạo một kho lưu trữ git trần với mã sau:

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

Một tùy chọn để có kho lưu trữ git từ xa là sử dụng giao thức SSH:

Một giao thức truyền tải phổ biến cho Git khi tự lưu trữ qua SSH. Điều này là do quyền truy cập SSH vào máy chủ đã được thiết lập ở hầu hết các nơi - và nếu không, điều đó rất dễ thực hiện. SSH cũng là một giao thức mạng được xác thực và bởi vì nó phổ biến, nên thường dễ cài đặt và sử dụng.

Để sao chép kho lưu trữ Git qua SSH, bạn có thể chỉ định một ssh://URL như thế này:

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

Hoặc bạn có thể sử dụng cú pháp giống như scp ngắn hơn cho giao thức SSH:

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

Trong cả hai trường hợp trên, nếu bạn không chỉ định tên người dùng tùy chọn, Git giả sử người dùng mà bạn hiện đang đăng nhập.

Ưu điểm

Ưu điểm của việc sử dụng SSH là rất nhiều. Đầu tiên, SSH tương đối dễ cài đặt - Daemon SSH là phổ biến, nhiều quản trị viên mạng có kinh nghiệm với họ và nhiều bản phân phối HĐH được thiết lập với họ hoặc có các công cụ để quản lý chúng. Tiếp theo, truy cập qua SSH là an toàn - tất cả truyền dữ liệu được mã hóa và xác thực. Cuối cùng, giống như các giao thức HTTPS, Git và Local, SSH rất hiệu quả, làm cho dữ liệu nhỏ gọn nhất có thể trước khi chuyển nó.

Nhược điểm

Khía cạnh tiêu cực của SSH là nó không hỗ trợ truy cập ẩn danh vào kho Git của bạn. Nếu bạn đang sử dụng SSH, mọi người phải có quyền truy cập SSH vào máy của bạn, ngay cả trong khả năng chỉ đọc, điều này không giúp SSH có lợi cho các dự án nguồn mở mà mọi người có thể chỉ muốn sao chép kho lưu trữ của bạn để kiểm tra nó. Nếu bạn chỉ sử dụng nó trong mạng công ty, SSH có thể là giao thức duy nhất bạn cần xử lý. Nếu bạn muốn cho phép truy cập chỉ đọc ẩn danh vào các dự án của mình và cũng muốn sử dụng SSH, bạn sẽ phải thiết lập SSH để bạn chuyển qua nhưng một cái gì đó khác để người khác tìm nạp.

Để biết thêm thông tin, hãy kiểm tra tham chiếu: Git trên Máy chủ - Các giao thức


3

Bạn cần tạo một thư mục trên một máy chủ từ xa. Sau đó sử dụng lệnh "git init" để đặt nó làm kho lưu trữ. Điều này nên được thực hiện cho từng dự án mới mà bạn có (mỗi thư mục mới)

Giả sử bạn đã thiết lập và sử dụng git bằng các phím ssh, tôi đã viết một tập lệnh Python nhỏ, khi được thực thi từ một thư mục làm việc sẽ thiết lập một điều khiển từ xa và khởi tạo thư mục dưới dạng repo git. Tất nhiên, bạn sẽ phải chỉnh sửa tập lệnh (chỉ một lần) để báo cho nó biết máy chủ và đường dẫn Root cho tất cả các kho lưu trữ.

Kiểm tra tại đây - https://github.com/skbobade/ocgi


-3

Thông thường bạn có thể thiết lập repo git chỉ bằng cách sử dụng initlệnh

git init

Trong trường hợp của bạn, đã có một repo trên một điều khiển từ xa có sẵn. Phụ thuộc vào cách bạn truy cập repo từ xa của bạn (với tên người dùng bên trong url hoặc khóa ssh xử lý xác minh) chỉ sử dụng clonelệnh:

git clone git@[my.url.com]:[git-repo-name].git

Cũng có những cách khác để sao chép repo. Bằng cách này, bạn gọi nó nếu bạn có một thiết lập khóa ssh trên máy của bạn để xác minh việc kéo kho lưu trữ của bạn. Có các kết hợp khác của url nếu bạn muốn bao gồm mật khẩu và tên người dùng của mình bên trong để đăng nhập vào kho lưu trữ từ xa.


1
thật là mỉa mai .... có ai đó đã hạ thấp câu trả lời này ngày hôm nay, và bây giờ tôi đang vật lộn với việc đẩy các tập tin của mình. Có vẻ như tôi cần một số bài tập thể dục để git vào nó một lần nữa!
Alex Cio

7
Tôi nghĩ vấn đề là OP muốn có giải pháp tạo repo từ xa trên máy chủ ssh, nhưng bạn đã mô tả cách tạo repo cục bộ từ máy chủ ssh từ xa. Bạn đã không trả lời câu hỏi. (Không phải tôi là người thất bại.)
peterh - Tái lập Monica
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.