2011-10-03 52 views
231

tôi cần phải tạo ra một kho Git trung tâm nhưng tôi là một chút nhầm lẫn ...Bạn sử dụng kho lưu trữ "git --bare init" như thế nào?

Tôi đã tạo ra 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 phải đẩy các tập tin từ kho lưu trữ cục bộ của tôi (máy 1) vào kho lưu trữ trống (máy 2). Tôi có quyền truy cập vào máy 2 bằng SSH. Vấn đề là tôi nghĩ rằng tôi không hiểu khái niệm về một kho trống ...

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

Có đúng cách để có kho lưu trữ trung tâm để có kho lưu trữ không?

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

Trả lời

298

Thứ nhất, chỉ cần kiểm tra, bạn cần phải thay đổi vào thư mục bạn đã tạo trước khi chạy git init --bare. Ngoài ra, thông thường để cung cấp kho trống phần 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 gì

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

Để trả lời câu hỏi sau của bạn, kho trần (theo định nghĩa) không có một 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 các tập tin với họ như bạn làm trong một kho lưu trữ phi trần bình thường (ví dụ với git add <file> và sau git commit.)

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

Lưu ý rằng trong trường hợp này, trước tiên bạn cần cho phép mọi người đẩy vào kho lưu trữ của bạn. Khi bên 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 điều này tại nơi làm việc, chứ không phải cho một cá nhân dự án nhà.

+5

Bạn cũng có thể thêm tùy chọn '--shared' cho' init' nếu bạn định có người khác đẩy tới repo này. Nó tự động thêm quyền ghi nhóm vào kho lưu trữ - [link] (http://git-scm.com/book/en/Git-on-the-Server-Getting-Git-on-a-Server) – prasanthv

+14

Tôi nghĩ rằng những ba dòng có cùng tác dụng so với chỉ có một dòng: git --bare init test_repo.git Ít nhất với phiên bản git hiện tại của tôi (1.8.2.2) –

+1

@Fran Không tốt cho 1.7. * Phiên bản có vẻ như: \ – deepdive

17

này nên là đủ:

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

Xem để biết thêm chi tiết "GIT: How do I update my bare repo?".
Ghi chú:

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

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

kho Bare là một trong đó có 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 thư mục .git.

Bạn chỉ có thể commit vào kho trống bằng cách push nhập vào 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 tin được sửa đổi, không có thay đổi.

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

20

Thực hành chung là có kho lưu trữ trung tâm mà bạn đẩy dưới dạng 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 một repo trần Git. Nó không có các tệp 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 điều khiển từ xa vào repo trần từ repo địa phương của bạn và đẩy "mã" của bạn vào đó.

Nó sẽ là một cái gì đó như:

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

Sử dụng 'git remote add central ', trong trường hợp SSH sẽ bao gồm đường dẫn? ví dụ. 'git remote add central ssh: // user @ server/home/user/repo.git' –

5

Nó là tốt đẹp để xác minh rằng mã bạn đẩy thực sự đã cam kết.

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

$ 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.

20

Bạn cũng có thể hỏi git để tạo thư mục cho bạn:

git init --bare test_repo.git 
151

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

Lưu ý: ví dụ này sử dụng đườ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 đi cho những người ít quen thuộc hơn 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à populates nó với các tập tin git đại diện cho một repo git. Vì nó là viết tắt, repo này là vô ích - 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ể kéo nó ra.

Tiếp theo, chúng ta cần tạo thư mục hoạt động. Có một số cách để thực hiện việc này, tùy thuộc vào việc bạn 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ó file hiện hành) bằng cách nhân bản 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ỉ làm việc nếu /path/to/work không tồn tại hoặc là một thư mục trống. 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/work và 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 (bởi vì git branch không trả về gì) và cho đến nay, không có cam kết.

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 [email protected] 
> git commit -m "added afile" 
[master (root-commit) 614ab02] added afile 
1 file changed, 1 insertion(+) 
create mode 100644 afile.txt 

Lệnh git config chỉ cần thiết nếu bạn chưa nói với chính mình 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 chi nhánh master đượ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 

Đây cũng là sai lầm - thượng nguồn đã không "ra đi", nó chỉ chưa được tạo ra chưa và git branch --unset-upstream sẽ không giúp đỡ. Nhưng đó là OK, bây giờ mà chúng tôi có cam kết đầu tiên của chúng tôi, chúng tôi có thể đẩy và làm chủ sẽ được tạo ra 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ư 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 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 đó (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 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 tôi có cam kết đầu tiên của chúng tôi và chi nhánh chính tại địa phương mà chúng tôi cần chuyển sang nhánh thượng nguồn đượ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 ý cờ -u trên git đẩy để đặt nhánh ngược dòng mới (theo dõi). Cũng giống như trước đây, bây giờ chúng ta có một repo trần đầy đủ chức năng mà có thể được nhân bản ở nơi khác trên một 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ẻ hiển nhiên đối với một số người, nhưng git làm phiền tôi nhiều nhất (đó là thông báo lỗi và trạng thái thực sự cần sửa lại) - hy vọng điều này sẽ giúp người khác.

+1

Thú vị. Chắc chắn chi tiết hơn câu trả lời của tôi. +1 – VonC

+7

Câu trả lời này giải quyết được vấn đề của tôi và phải 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

+0

Cảm ơn câu trả lời hữu ích này –

1

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

Ví dụ: khi bạn thêm tệp vào 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 cho nó luôn là '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ể nhìn thấy nó không rõ ràng 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 lưu trữ 'bản sao' trong máy 2 đều không trống. relationship between bare and non-bare repositories

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

0

Dựa trên Đánh dấu Longair & Roboprog câu trả lời:

nếu phiên bản git> = 1,8

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

Hoặc:

nếu phiên bản git < 1,8

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

Lệnh cấu hình đó: làm thế nào nó kết thúc áp dụng cho thư mục .git mà bạn vừa tạo? – GreenAsJade

+0

Tôi không chắc tôi hiểu câu hỏi của bạn? Bạn có thể chính xác hơn không? Vì bạn đã khởi tạo kho git, bạn có thể cấu hình nó nhiều như bạn muốn với lệnh 'git config' .. – Jack

Các vấn đề liên quan