Làm thế nào để bạn sử dụng kho lưu trữ init git --bare init?


321

Tôi cần tạo một kho lưu trữ Git trung tâm nhưng tôi hơi bối rối ...

Tôi đã tạo một kho lưu trữ trần (trong máy chủ git của tôi, máy 2) với:

$ mkdir test_repo
$ git --bare init

Bây giờ tôi cần đẩy các tệp từ kho lưu trữ cục bộ (máy 1) sang kho lưu trữ trần (máy 2). Tôi có quyền truy cập vào máy 2 bằng SSH. Có điều là tôi nghĩ rằng tôi không hiểu khái niệm về một kho lưu trữ trần ...

Cách lưu trữ mã của tôi trong kho lưu trữ trống là gì? Làm cách nào tôi có thể đẩy các thay đổi từ kho lưu trữ cục bộ của mình sang kho lưu trữ trần?

Là cách đúng đắn để có một kho lưu trữ trung tâm để có một kho lưu trữ trần?

Tôi hơi bối rối với chủ đề này. Xin vui lòng cho tôi một manh mối về điều này.

Câu trả lời:


392

Đầu tiên, chỉ cần kiểm tra, bạn cần thay đổi vào thư mục bạn đã tạo trước khi chạy git init --bare. Ngoài ra, nó là thông thường để cung cấp các kho lưu trữ mở rộng .git. Vì vậy bạn có thể làm

git init --bare test_repo.git

Đối với phiên bản Git <1.8 bạn sẽ làm

mkdir test_repo.git
cd test_repo.git
git --bare init

Để trả lời các câu hỏi sau này của bạn, các kho lưu trữ trần (theo định nghĩa) không có cây làm việc gắn liền với chúng, vì vậy bạn không thể dễ dàng thêm tệp vào chúng như trong kho lưu trữ không trống thông thường (ví dụ: git add <file>và sau đó git commit. )

Bạn hầu như luôn cập nhật một kho lưu trữ trần bằng cách đẩy nó (sử dụng git push) từ kho lưu trữ khác.

Lưu ý rằng trong trường hợp này, trước tiên bạn sẽ cần cho phép mọi người đẩy vào kho lưu trữ của bạn. Khi bên trong test_repo.git, làm

git config receive.denyCurrentBranch ignore

Chỉnh sửa cộng đồng

git init --bare --shared=group

Theo nhận xét của prasanthv, đây là những gì bạn muốn nếu bạn đang làm việc này tại nơi làm việc, thay vì cho một dự án nhà riêng.


7
Bạn cũng có thể thêm --sharedtùy chọn initnếu bạn dự định nhờ người khác đẩy vào repo này. Nó tự động thêm quyền ghi nhóm vào kho lưu trữ - liên kết
prasanthv

17
Tôi nghĩ ba dòng này có cùng tác dụng so với chỉ một dòng này: git --bare init test_Vpo.git Ít nhất là với phiên bản git hiện tại của tôi (1.8.2.2)
Fran Marzoa

1
hữu ích nếu bạn muốn biết sự khác biệt giữa repos trần và không trần stackoverflow.com/questions/7861184/iêu
Guille Acosta

Làm thế nào để git tìm thấy công cụ nếu không có cây làm việc? Tôi nghĩ rằng có một cây làm việc trong cửa hàng đối tượng git, và đó là những gì
SHA

@akantoword: git lưu trữ tất cả các thông tin về các cam kết và chi nhánh ở đâu đó. Một cam kết có lẽ chủ yếu là khác biệt giữa phiên bản trước của tệp và phiên bản mới. Cây làm việc chỉ là một ảnh chụp nhanh nội dung thực của nó tại một thời điểm cụ thể. Dù sao, với một cây làm việc, bạn có thể qua lại giữa các cam kết và các nhánh. Bạn thậm chí có thể kiểm tra trên một cây làm việc khác nếu bạn muốn.
dùng276648

246

Tôi đang thêm câu trả lời này bởi vì sau khi đến đây (với cùng một câu hỏi), không có câu trả lời nào thực sự mô tả tất cả các bước cần thiết để đi từ không có gì đến một repo từ xa hoàn toàn có thể sử dụng được.

Lưu ý: ví dụ này sử dụng các đường dẫn cục bộ cho vị trí của repo trần, nhưng các giao thức git khác (như SSH được chỉ định bởi OP) sẽ hoạt động tốt.

Tôi đã cố gắng thêm một số ghi chú trên đường cho những người ít quen thuộc với git.

1. Khởi tạo repo trần ...

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

Điều này tạo ra một thư mục (repo.git) và điền nó với các tệp git đại diện cho một repo git. Như nó đứng, repo này là vô dụng - nó không có cam kết và quan trọng hơn, không có chi nhánh . Mặc dù bạn có thể sao chép repo này, bạn không thể lấy từ nó.

Tiếp theo, chúng ta cần tạo một thư mục làm việc. Có một số cách để làm điều này, tùy thuộc vào việc bạn có các tệp hiện có hay không.

2a. Tạo một thư mục làm việc mới (không có tệp hiện có) bằng cách sao chép repo trống

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

Lệnh này sẽ chỉ hoạt động nếu /path/to/workkhông tồn tại hoặc là một thư mục trống. Hãy lưu ý cảnh báo - ở giai đoạn này, bạn vẫn không có gì hữu ích. Nếu bạn cd /path/to/workvà chạy git status, bạn sẽ nhận được một cái gì đó như:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

nhưng đây là một lời nói dối. Bạn không thực sự ở chi nhánh master(vì git branchkhông trả lại gì) và cho đến nay, không có cam kết nào.

Tiếp theo, sao chép / di chuyển / tạo một số tệp trong thư mục làm việc, thêm chúng vào git và tạo cam kết đầu tiên.

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

Các git configlệnh chỉ cần thiết nếu bạn chưa nói với git bạn là ai. Lưu ý rằng nếu bây giờ bạn chạy git branch, bây giờ bạn sẽ thấy masterchi nhánh được liệt kê. Bây giờ chạy git status:

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

Điều này cũng gây hiểu lầm - ngược dòng chưa "biến mất", nó chỉ chưa được tạo và git branch --unset-upstreamsẽ không giúp đỡ. Nhưng không sao, bây giờ chúng tôi có cam kết đầu tiên, chúng tôi có thể đẩy và chủ sẽ được tạo trên repo trần.

> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

Tại thời điểm này, chúng tôi có một repo trần đầy đủ chức năng có thể được nhân bản ở nơi khác trên nhánh chính cũng như một bản sao làm việc cục bộ có thể kéo và đẩy.

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2b. Tạo một thư mục làm việc từ các tệp hiện có Nếu bạn đã có một thư mục chứa các tệp trong đó (vì vậy bạn không thể sao chép vào nó), bạn có thể khởi tạo một repo git mới, thêm một cam kết đầu tiên và sau đó liên kết nó với repo trần sau đó.

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

Tại thời điểm này, chúng ta có cam kết đầu tiên và một nhánh chính cục bộ mà chúng ta cần biến thành một nhánh ngược dòng được theo dõi từ xa.

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

Lưu ý -ucờ trên git đẩy để đặt nhánh ngược dòng được theo dõi (mới). Cũng như trước đây, bây giờ chúng ta có một repo trần đầy đủ chức năng có thể được nhân bản ở nơi khác trên nhánh chính cũng như một bản sao làm việc cục bộ có thể kéo và đẩy.

Tất cả điều này có vẻ rõ ràng đối với một số người, nhưng git làm tôi bối rối vào thời điểm tốt nhất (đó là lỗi và thông báo trạng thái thực sự cần một số làm lại) - hy vọng, điều này sẽ giúp những người khác.


4
Hấp dẫn. Chắc chắn chi tiết hơn câu trả lời của tôi. +1
VonC

13
Câu trả lời này giải quyết vấn đề của tôi và nên là câu trả lời được chấp nhận, hy vọng ngày càng nhiều người có thể bỏ phiếu.
inix

11
Bạn nên tính tiền cho câu trả lời như thế này
Arthur Tarasov

2
Là một người dùng git mới, câu trả lời này rất hữu ích với tôi, cảm ơn vì đã viết bài này!
sidinderguy

1
Đây là một câu trả lời tuyệt vời. Sẽ giúp đơn vị chúng tôi rất nhiều.
wobsoriano

33

Trả lời từng câu hỏi của bạn:

Kho lưu trữ trần là cái không có cây làm việc . Nó có nghĩa là toàn bộ nội dung của nó là những gì bạn có trong .gitthư mục.

Bạn chỉ có thể commitlưu trữ trần bằng cách pushlấy nó từ bản sao cục bộ của bạn. Nó không có cây làm việc, vì vậy nó không có tệp nào được sửa đổi, không có thay đổi.

Để có kho lưu trữ trung tâm, cách duy nhất là có một barekho lưu trữ.


22

Bạn cũng có thể yêu cầu git tạo thư mục cho bạn:

git init --bare test_repo.git

20

Thực tiễn chung là có kho lưu trữ trung tâm mà bạn đẩy như một repo trần.

Nếu bạn có nền SVN, bạn có thể liên kết một repo SVN với repo trần Git. Nó không có các tập tin trong repo ở dạng ban đầu. Trong khi đó repo cục bộ của bạn sẽ có các tệp tạo thành "mã" của bạn.

Bạn cần thêm một điều khiển từ xa vào repo trần từ repo cục bộ của bạn và đẩy "mã" của bạn vào nó.

Nó sẽ giống như:

git remote add central <url> # url will be ssh based for you
git push --all central

Sử dụng git remote add central <url>, trong trường hợp SSH, điều này có bao gồm cả đường dẫn không? ví dụgit remote add central ssh://user@server/home/user/repo.git
Có Barry

17

Điều này là đủ:

git remote add origin <url-of-bare-repo>
git push --all origin

Xem để biết thêm chi tiết " GIT: Làm cách nào để cập nhật repo trần của tôi? ".
Ghi chú:

  • bạn có thể sử dụng một tên khác với ' origin' cho tham chiếu từ xa repo trần.
  • Điều này sẽ không đẩy các thẻ của bạn, bạn cần riêng biệt git push --tags origincho điều đó.

5

Thật tuyệt khi xác minh rằng mã bạn đã đẩy thực sự đã cam kết.

Bạn có thể nhận được nhật ký thay đổi trên kho lưu trữ trống bằng cách đặt rõ ràng đường dẫn bằng tùy chọn --relative.

$ cd test_repo
$ git log --relative=/

Điều này sẽ cho bạn thấy những thay đổi đã cam kết như thể đây là một repo git thông thường.


5

Dựa trên câu trả lời của Mark Longair & Roboprog:

nếu phiên bản git> = 1.8

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

Hoặc là :

nếu phiên bản git <1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore

Lệnh config đó: làm thế nào để nó kết thúc việc áp dụng vào thư mục .git bạn vừa tạo?
GreenAsJade

Tôi không chắc là tôi hiểu câu hỏi của bạn? Bạn có thể chính xác hơn? Vì bạn đã khởi tạo kho git của mình, bạn có thể định cấu hình nó bao nhiêu tùy ý bằng lệnh 'git config' ..
Jack '

@GreenAsJade Đó là vì bạn vẫn ở trong thư mục của kho git, nên nó áp dụng cho điều đó (mặc định của cấu hình git giống như tùy chọn --local).
BlueCoder

2

Cờ --bare tạo ra một kho lưu trữ không có thư mục hoạt động. Kho lưu trữ trần là kho lưu trữ trung tâm và bạn không thể chỉnh sửa (lưu trữ) mã ở đây để tránh lỗi hợp nhất.

Ví dụ: khi bạn thêm một tệp trong kho lưu trữ cục bộ (máy 1) và đẩy tệp đó vào kho lưu trữ trống, bạn không thể thấy tệp trong kho lưu trữ trống vì nó luôn 'trống'. Tuy nhiên, bạn thực sự đẩy một cái gì đó vào kho lưu trữ và bạn có thể thấy nó vô tình bằng cách nhân bản một kho lưu trữ khác trong máy chủ của bạn (máy 2).

Cả kho lưu trữ cục bộ trong máy 1 và kho 'sao chép' trong máy 2 đều không trống. mối quan hệ giữa kho lưu trữ trần và không trần

Blog sẽ giúp bạn hiểu nó. https://www.atlassian.com/git/tutorials/setting-up-a-reposeective


0

Bạn có thể thực thi các lệnh sau để khởi tạo kho lưu trữ cục bộ của mình

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

Bạn nên làm việc với dự án của bạn từ kho lưu trữ cục bộ của bạn và sử dụng máy chủ làm kho lưu trữ trung tâm.

Bạn cũng có thể theo dõi bài viết này giải thích từng khía cạnh của việc tạo và duy trì kho lưu trữ Git. Git cho người mới bắt đầu

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.