Sự khác biệt giữa những gì mà bạn yêu thích và một người khác là gì?


162

Sự khác biệt giữa git initvà là git init --baregì? Tôi thấy rằng rất nhiều bài đăng blog yêu cầu --barecho máy chủ Git của họ?

Từ trang người đàn ông , nó nói:

--bare

Tạo một kho lưu trữ trần. Nếu môi trường GIT_DIR không được đặt, nó được đặt thành thư mục làm việc hiện tại

Nhưng nó thực sự có nghĩa là gì? Có bắt buộc phải có --baređể thiết lập máy chủ Git không?

Câu trả lời:


143

Repo không trần

Biến thể này tạo ra một kho lưu trữ với một thư mục làm việc để bạn thực sự có thể làm việc ( git clone). Sau khi tạo nó, bạn sẽ thấy rằng thư mục chứa một thư mục .git nơi lịch sử và tất cả các hệ thống ống nước git đi. Bạn làm việc ở cấp độ có thư mục .git.

Repo trần

Các biến thể khác tạo ra một kho lưu trữ mà không có một thư mục làm việc ( git clone --bare). Bạn không nhận được một thư mục nơi bạn có thể làm việc. Tất cả mọi thứ trong thư mục bây giờ là những gì được chứa trong thư mục .git trong trường hợp trên.

Tại sao bạn lại sử dụng cái này so với cái kia

Sự cần thiết của git repos mà không có thư mục làm việc là thực tế là bạn có thể đẩy các nhánh đến nó và nó không quản lý những gì ai đó đang làm việc. Bạn vẫn có thể đẩy đến một kho lưu trữ không trống, nhưng bạn sẽ bị từ chối vì bạn có khả năng có thể di chuyển một nhánh mà ai đó đang làm việc trong thư mục làm việc đó.

Vì vậy, trong một dự án không có thư mục làm việc, bạn chỉ có thể nhìn thấy các đối tượng khi git lưu trữ chúng. Chúng được nén và tuần tự hóa và được lưu trữ dưới SHA1 (hàm băm) của nội dung của chúng. Để có được một đối tượng trong một kho lưu trữ trống, bạn cần phải git showxác định sha1 của đối tượng bạn muốn xem. Bạn sẽ không thấy một cấu trúc như dự án của bạn trông như thế nào.

Kho lưu trữ trần thường là kho lưu trữ trung tâm nơi mọi người di chuyển công việc của họ đến. Không cần phải thao túng công việc thực tế. Đó là một cách để đồng bộ hóa các nỗ lực giữa nhiều người. Bạn sẽ không thể xem trực tiếp các tập tin dự án của bạn.

Bạn có thể không có nhu cầu cho bất kỳ kho lưu trữ trần nào nếu bạn là người duy nhất làm việc trong dự án hoặc bạn không muốn / cần một kho lưu trữ "trung tâm logic". Một người sẽ thích git pull từ các kho khác trong trường hợp đó. Điều này tránh được sự phản đối mà git có khi đẩy vào kho không trống.

Hi vọng điêu nay co ich


Giữ các , ném ra một từ dòng này - Một muốn git pull từ một người khác ... :-)
Arup Rakshit

10
Tôi thấy câu trả lời này rất không rõ ràng và khó hiểu. Một số lý do có tại đây: meta.stackoverflow.com/questions/339837/ cấp
Marko Avlijaš

Bare repositories are usually central repositories where everyone moves their work to.Bạn có muốn nói rằng một kho lưu trữ trần là nguồn mà các cộng tác viên dự án khác có thể sao chép một dự án không? Đó là, cộng tác viên coi điều này là remote?
Minh Trần

112

Câu trả lời ngắn

Kho lưu trữ trần là kho lưu trữ git không có bản sao hoạt động, do đó nội dung của .git là cấp cao nhất cho thư mục đó.

Sử dụng kho lưu trữ không trống để làm việc cục bộ và kho lưu trữ trần làm máy chủ / trung tâm trung tâm để chia sẻ các thay đổi của bạn với người khác. Ví dụ: khi bạn tạo một kho lưu trữ trên github.com, nó được tạo như một kho lưu trữ trần.

Vì vậy, trong máy tính của bạn:

git init
touch README
git add README
git commit -m "initial commit"

trên máy chủ:

cd /srv/git/project
git init --bare

Sau đó, trên máy khách, bạn đẩy:

git push username@server:/srv/git/project master

Sau đó, bạn có thể tự lưu bản đánh máy bằng cách thêm nó dưới dạng điều khiển từ xa.

Kho lưu trữ ở phía máy chủ sẽ nhận được các cam kết thông qua kéo và đẩy, chứ không phải do bạn chỉnh sửa các tệp và sau đó cam kết chúng trong máy chủ, do đó nó là một kho lưu trữ trần.

Chi tiết

Bạn có thể đẩy đến một kho lưu trữ không phải là một kho lưu trữ trần và git sẽ phát hiện ra rằng có một kho lưu trữ .git ở đó, nhưng vì hầu hết các kho lưu trữ "hub" không cần một bản sao hoạt động, nên việc sử dụng một kho lưu trữ trần là bình thường nó và được khuyến nghị vì không có điểm nào để có một bản sao hoạt động trong loại kho lưu trữ này.

Tuy nhiên, nếu bạn đẩy đến một kho lưu trữ không trống, bạn đang làm cho bản sao làm việc không nhất quán và git sẽ cảnh báo bạn:

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

Bạn có thể bỏ qua cảnh báo này. Nhưng thiết lập được đề xuất là: sử dụng kho lưu trữ không trống để làm việc cục bộ và kho lưu trữ trần làm trung tâm hoặc máy chủ trung tâm để đẩy và kéo từ đó.

Nếu bạn muốn chia sẻ công việc trực tiếp với bản sao làm việc của nhà phát triển khác, bạn có thể lấy từ các kho lưu trữ khác thay vì đẩy.


Nếu tôi muốn thực hiện dự án của mình trên máy chủ git, vì vậy không cần thiết phải có tùy chọn --bare, phải không?
Kit Ho

Bạn sử dụng trần cho kho lưu trữ từ xa, không phải cho kho lưu trữ cục bộ.
duncan

Đó là một chút thời gian, nhưng đây là một câu hỏi khác. Nếu chúng ta có một kho lưu trữ từ xa, bất kỳ nhà phát triển nào cũng có thể đẩy mạnh vào đó, kho lưu trữ là một kho lưu trữ "trung tâm". Nhưng nếu chúng ta làm việc mà không có kho lưu trữ trần, các nhà phát triển chỉ nên kéo nhau ra, chứ không bao giờ đẩy. Kịch bản cuối cùng là tốt, nếu chỉ có 2 bản sao của repo (còn gọi là repos địa phương). Điều này có đúng không?
Asturio

60

Khi tôi đọc câu hỏi này một thời gian trước, mọi thứ đều khó hiểu với tôi. Tôi mới bắt đầu sử dụng git và có những bản sao này đang hoạt động (có nghĩa là không có gì tại thời điểm đó). Tôi sẽ cố gắng giải thích điều này từ quan điểm của anh chàng, người mới bắt đầu git mà không biết gì về thuật ngữ.

Một ví dụ hay về sự khác biệt có thể được mô tả theo cách sau :

--barechỉ cung cấp cho bạn một nơi lưu trữ (bạn không thể phát triển ở đó). Không có --barenó cho bạn khả năng phát triển ở đó (và có một nơi lưu trữ).

git inittạo một kho git từ thư mục hiện tại của bạn. Nó thêm thư mục .git bên trong nó và làm cho nó có thể bắt đầu lịch sử sửa đổi của bạn.

git init --barecũng tạo một kho lưu trữ, nhưng nó không có thư mục làm việc. Điều này có nghĩa là bạn không thể chỉnh sửa tệp, cam kết thay đổi, thêm tệp mới trong kho lưu trữ đó.

Khi nào --barecó thể hữu ích? Bạn và một vài người khác đang làm việc trên dự án và sử dụng git. Bạn đã lưu trữ dự án trên một số máy chủ ( amazon ec2). Mỗi bạn có máy riêng và bạn đẩy mã của mình lên ec2. Không ai trong số bạn thực sự phát triển bất cứ thứ gì trên ec2(bạn sử dụng máy của mình) - bạn chỉ cần đẩy mã của mình. Vì vậy, của bạn ec2chỉ là một bộ lưu trữ cho tất cả các mã của bạn và nên được tạo ra --barevà tất cả các máy của bạn không có --bare(hầu hết chỉ là một, và cái khác sẽ chỉ sao chép mọi thứ). Quy trình làm việc trông như thế này:

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


1
Vì vậy, chúng ta có thể nói rằng bằng cách sử dụng kho lưu trữ --bare, chúng ta có thể tạo ra một loại kiến ​​trúc máy khách-máy chủ như lật đổ không?
Emiliano Sangoi

14

Kho lưu trữ Git mặc định giả định rằng bạn sẽ sử dụng nó làm thư mục làm việc của mình. Thông thường, khi bạn ở trên một máy chủ, bạn không cần phải có một thư mục làm việc. Chỉ là kho lưu trữ. Trong trường hợp này, bạn nên sử dụng --baretùy chọn.


trong một repo với tùy chọn --bare, vì vậy chúng ta không thể xem tất cả các tệp dự án? Có vẻ như tôi mất tất cả tệp dự án của mình với tùy chọn --bare ..
Kit Ho

11

Một kho lưu trữ không trần là mặc định. Nó là những gì được tạo ra khi bạn chạy git inithoặc những gì bạn nhận được khi sao chép (không có baretùy chọn) từ máy chủ.

Khi bạn làm việc với một kho lưu trữ như thế này, bạn có thể xem và chỉnh sửa tất cả các tệp trong kho lưu trữ. Khi bạn tương tác với kho lưu trữ - ví dụ bằng cách thực hiện thay đổi - Git lưu trữ các thay đổi của bạn trong một thư mục ẩn được gọi .git.

Khi bạn có một máy chủ git, không cần phải có các bản sao của các tệp. Tất cả bạn cần là dữ liệu Git được lưu trữ trong .git. Một kho lưu trữ chính xác là .gitthư mục, không có vùng làm việc để sửa đổi và cam kết các tệp.

Khi bạn sao chép từ máy chủ, Git có tất cả thông tin cần thiết trong .gitthư mục để tạo bản sao làm việc của bạn.


1

Một điểm khác biệt giữa kho lưu trữ --bare và Work Tree là trong trường hợp đầu tiên, không có cam kết bị mất nào được lưu trữ, mà chỉ các xác nhận thuộc về một rãnh nhánh được lưu trữ. Mặt khác, Work Tree giữ tất cả các cam kết mãi mãi. Xem bên dưới...

Tôi đã tạo kho lưu trữ đầu tiên (tên: git-Bare ) với git init --bare. Đó là máy chủ. Nó ở phía bên trái, nơi không có các nhánh từ xa vì đây là kho lưu trữ từ xa.

Tôi đã tạo kho lưu trữ thứ hai (tên: git-work-tree ) git clonetừ cái đầu tiên. Nó ở bên phải. Nó có các chi nhánh địa phương liên kết với các chi nhánh từ xa.

(Các văn bản 'đầu tiên', 'thứ hai', 'thứ ba', 'thứ tư', 'alpha', 'beta' và 'delta' là các nhận xét cam kết. Tên 'chủ' và 'Hy Lạp' là tên chi nhánh.)

Kho lưu trữ cục bộ và từ xa

Bây giờ tôi sẽ xóa nhánh có tên 'hy lạp' cả trong git-Bare (lệnh git push --delete origin greek:) và cục bộ trong git-work-tree (lệnh git branch -D greek:). Đây là cây trông như thế nào:

Kho git-trần xóa những gì không còn được tham chiếu

Các git-trần kho xóa cả chi nhánh và tất cả comits tham chiếu. Trong ảnh chúng ta thấy rằng cây của nó đã bị giảm vì lý do này.

Mặt khác, kho lưu trữ git-work-tree , tương đương với kho lưu trữ cục bộ thường được sử dụng, không xóa các xác nhận, giờ đây chỉ có thể được tham chiếu trực tiếp bởi hàm băm của bạn bằng một git checkout 7fa897b7lệnh. Đó là lý do tại sao cây của nó không có cấu trúc sửa đổi.

IN BRIEF: Cam kết không bao giờ bị bỏ trong kho lưu trữ của cây làm việc , nhưng bị xóa trong kho lưu trữ trần .

Trong điều kiện thực tế, bạn chỉ có thể khôi phục một nhánh bị xóa trên máy chủ nếu nó tồn tại trong một kho lưu trữ cục bộ.

Nhưng điều rất lạ là kích thước của kho lưu trữ trống không giảm kích thước đĩa sau khi xóa một nhánh từ xa. Đó là, các tập tin vẫn còn đó bằng cách nào đó. Để kết xuất kho lưu trữ bằng cách xóa những gì không còn được tham chiếu hoặc những gì không bao giờ có thể được tham chiếu (trường hợp sau) sử dụng git gc --prunelệnh


Để kiểm tra các lệnh git, hãy thử: github.com/sergiocabral/App.GitPlayground
Sergio Cabral
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.