Sự khác biệt-thực tế giữa kho lưu trữ Bare và không Bare là gì?


213

Tôi đã đọc về các repositor trần và không trần / mặc định trong Git. Tôi chưa thể hiểu khá rõ (về mặt lý thuyết) về sự khác biệt giữa chúng và lý do tại sao tôi nên "đẩy" đến một kho lưu trữ trống. Đây là thỏa thuận:

Hiện tại, tôi là người duy nhất làm việc trong một dự án trên 3 máy tính khác nhau, nhưng sẽ có nhiều người tham gia vào nó sau này, vì vậy tôi đang sử dụng Git để kiểm soát phiên bản. Tôi sao chép repo trần trên tất cả các máy tính và khi tôi hoàn thành các sửa đổi của mình trên một trong số chúng, tôi cam kết và đẩy các thay đổi sang repo trần. Từ những gì tôi đã đọc, kho lưu trữ trần KHÔNG có "cây làm việc", vì vậy nếu tôi sao chép repo trần, tôi sẽ không có "cây làm việc".

Tôi đoán rằng cây làm việc lưu trữ thông tin cam kết, các nhánh, v.v. từ dự án. Điều đó sẽ không xuất hiện trong repo trần. Vì vậy, có vẻ tốt hơn đối với tôi để "đẩy" các cam kết vào repo với cây làm việc.

Vậy thì, tại sao tôi nên sử dụng kho lưu trữ trần và tại sao không? Sự khác biệt thực tế là gì? Điều đó sẽ không có lợi cho nhiều người làm việc trong một dự án, tôi cho rằng.

Phương pháp của bạn cho loại công việc này là gì? Gợi ý?


4
AeroCross, bạn có thể sao chép một kho lưu trữ trần để tạo một kho lưu trữ không trống (nghĩa là một kho lưu trữ có không gian làm việc). Vì vậy, sử dụng git clonebạn có thể tự do chuyển đổi giữa các kho lưu trữ trần và không trần.
Derek Mahar

13
@AeroCross: Không phải là về chuyển đổi; không có vấn đề gì ở đầu bên kia. Nếu bạn chạy, git clone --barebạn sẽ nhận được một repo trần, và nếu bạn chạy git clone, bạn sẽ nhận được một cái không trần. Mỗi dự án công khai mà bạn từng nhân bản (được lưu trữ trên github chẳng hạn) là một kho lưu trữ trống ở đầu bên kia.
Cascabel

1
Jefromi, tôi đã sửa điểm của AeroCross, "vì vậy nếu tôi sao chép repo trần, tôi sẽ không có" cây làm việc "", vì vậy đó là một loại chuyển đổi. Và không phải mọi dự án công cộng phải là một kho lưu trữ trần. Đây chỉ là lựa chọn điển hình vì kho lưu trữ trần hiệu quả hơn về không gian vì nó không có cây làm việc (mặc dù nó không gian hiệu quả như bất kỳ kho lưu trữ nào không có cây làm việc).
Derek Mahar

2
@Derek: Nhưng vấn đề là, ngay khi tìm thấy thư mục .git, việc tìm nạp hoàn toàn không biết liệu điều khiển từ xa có trống hay không. Nó không chuyển đổi. Nó chỉ lấy những gì nó cần từ xa, và đặt nó ở nơi cần đến. Không có gì để chuyển đổi. Đó là những gì tôi đã cố gắng nhấn mạnh với OP. Và tôi nhận thức rõ rằng các dự án công cộng không cần phải trần, nhưng vì mọi người không ngu ngốc, nên về cơ bản tất cả đều như vậy. Tôi nghĩ rằng tôi đã thực hiện một khái quát chấp nhận được.
Cascabel

2
Xem Đẩy vào kho lưu trữ không trần để đưa ra một lời giải thích tuyệt vời khác về việc sử dụng kho lưu trữ trần.
Craig McQueen

Câu trả lời:


95

Một điểm khác biệt giữa kho lưu trữ trần và không trống là kho lưu trữ trần không có kho lưu trữ gốc từ xa mặc định :

~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
~/Projects$ cd bare
~/Projects/bare$ git branch -a
* master
~/Projects/bare$ cd ..
~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
~/Projects$ cd non-bare
~/Projects/non-bare$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Từ trang hướng dẫn cho git clone --bare:

Ngoài ra, các đầu nhánh ở điều khiển từ xa được sao chép trực tiếp vào các đầu nhánh cục bộ tương ứng, mà không ánh xạ chúng tới refs / điều khiển từ xa / origin /. Khi tùy chọn này được sử dụng, cả các nhánh theo dõi từ xa cũng như các biến cấu hình liên quan đều không được tạo.

Có lẽ, khi nó tạo một kho lưu trữ trần, Git giả định rằng kho lưu trữ trần sẽ đóng vai trò là kho lưu trữ gốc cho một số người dùng từ xa, vì vậy nó không tạo ra nguồn gốc từ xa mặc định. Điều này có nghĩa là cơ bản git pullvà các git pushhoạt động sẽ không hoạt động vì Git giả định rằng không có không gian làm việc, bạn không có ý định thực hiện bất kỳ thay đổi nào đối với kho lưu trữ trần:

~/Projects/bare$ git push
fatal: No destination configured to push to.
~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
~/Projects/bare$ 

1
Vâng, tôi đồng ý rằng đây có thể là sự khác biệt đáng kể nhất giữa kho Git trần và không trần. Thực tế là một kho lưu trữ không có trần có một không gian làm việc, nhưng một kho lưu trữ trần không phải là một sự khác biệt quan trọng, nhưng git clone --no-checkoutcũng có thể tạo ra một kho lưu trữ không trống không có tệp không gian làm việc.
Derek Mahar

10
Một kho lưu trữ không trống cũng không nhất thiết phải có "nguồn gốc" mặc định.
mipadi

2
Bạn có thể tạo một kho lưu trữ Git đơn giản với git init, nó sẽ tạo ra một repo không trống mà không có chỉ định từ xa.
mipadi

1
mipadi, điều này là đúng, nhưng nó cũng không phải là một bản sao.
Derek Mahar

1
Điều này là không đúng. Một kho lưu trữ sẽ có nguồn gốc mặc định nếu nó đã được cloneed. Nếu nó đã được inited cục bộ, nó sẽ không có nguồn gốc như vậy. Điều này không liên quan gì đến việc nó có trần hay không.
Noufal Ibrahim

62

Sự khác biệt giữa kho lưu trữ Git trần và không trần là giả tạo và gây hiểu lầm vì không gian làm việc không phải là một phần của kho lưu trữ và kho lưu trữ không yêu cầu không gian làm việc. Nói đúng ra, kho Git bao gồm những đối tượng mô tả trạng thái của kho lưu trữ. Các đối tượng này có thể tồn tại trong bất kỳ thư mục nào, nhưng thường tồn tại trong .gitthư mục trong thư mục cấp cao nhất của không gian làm việc. Không gian làm việc là một cây thư mục đại diện cho một cam kết cụ thể trong kho lưu trữ, nhưng nó có thể tồn tại trong bất kỳ thư mục nào hoặc không. Biến môi trường $GIT_DIRliên kết một không gian làm việc với kho lưu trữ mà nó bắt nguồn.

Các lệnh Git git clonegit initcả hai đều có các tùy chọn --baretạo kho lưu trữ mà không có không gian làm việc ban đầu. Nó không may rằng Git conflates hai khái niệm riêng biệt, nhưng có liên quan của không gian làm việc và kho và sau đó sử dụng thuật ngữ khó hiểu trần để tách hai ý tưởng.


61

Kho lưu trữ trống không là gì ngoài chính thư mục .git tức là nội dung của kho lưu trữ trần giống như nội dung của thư mục .git bên trong kho lưu trữ làm việc cục bộ của bạn.

  • Sử dụng kho lưu trữ trần trên một máy chủ từ xa để cho phép nhiều người đóng góp đẩy công việc của họ.
  • Không trần - Người có cây làm việc có ý nghĩa trên máy cục bộ của từng người đóng góp cho dự án của bạn.

60

5 năm quá muộn, tôi biết, nhưng không ai thực sự trả lời câu hỏi:

Vậy thì, tại sao tôi nên sử dụng kho lưu trữ trần và tại sao không? Sự khác biệt thực tế là gì? Điều đó sẽ không có lợi cho nhiều người làm việc trong một dự án, tôi cho rằng.

Phương pháp của bạn cho loại công việc này là gì? Gợi ý?

Để trích dẫn trực tiếp từ cuốn sách Loeliger / MCullough (980-1-449-31638-9, p196 / 7):

Một kho lưu trữ trần dường như ít được sử dụng, nhưng vai trò của nó rất quan trọng: đóng vai trò là đầu mối có thẩm quyền để phát triển hợp tác. Các nhà phát triển khác clonefetchtừ kho lưu trữ trần và pushcập nhật lên nó ... nếu bạn thiết lập một kho lưu trữ mà các nhà phát triển pushthay đổi, thì nó sẽ trống. Trong thực tế, đây là một trường hợp đặc biệt của thực tiễn tốt nhất chung chung hơn mà một kho lưu trữ được xuất bản nên để trống.


19

Một kho lưu trữ không trần chỉ đơn giản là có một cây làm việc được kiểm tra. Cây làm việc không lưu trữ bất kỳ thông tin nào về trạng thái của kho lưu trữ (các nhánh, thẻ, v.v.); thay vào đó, cây làm việc chỉ là một đại diện của các tệp thực tế trong repo, cho phép bạn làm việc (chỉnh sửa, v.v.) các tệp.


Vì vậy, điều đó có nghĩa là tôi có thể thêm các nhánh, thẻ, v.v. vào kho lưu trữ trần rồi kéo từ kho lưu trữ trần sang kho không sản xuất / sản xuất?
AeroCross

2
mipadi, một kho lưu trữ không trống có thể không có cây kiểm tra. Đây là trường hợp nếu bạn tạo một kho lưu trữ không trống với git clone --no-checkout. Trong trường hợp này, kho lưu trữ không trống có một vị trí cho không gian làm việc, nhưng Git không kiểm tra bất kỳ tệp nào vào không gian làm việc đó.
Derek Mahar

17

Một kho lưu trữ trần có lợi ích trong

  • giảm sử dụng đĩa
  • ít vấn đề hơn liên quan đến việc đẩy từ xa (vì không có cây làm việc nào ở đó để thoát khỏi sự đồng bộ hoặc có những thay đổi mâu thuẫn)

3
Vì vậy, kho lưu trữ trần là cách tốt nhất / được đề xuất để làm việc với nhiều người không có quyền truy cập vào kho của THEIR? (Giống như SVN?)
AeroCross

2
AeroCross, tôi muốn nói rằng một kho lưu trữ trần là một lựa chọn tốt cho kịch bản đó.
Derek Mahar

12

Kho lưu trữ không trống cho phép bạn (vào cây làm việc của bạn) nắm bắt các thay đổi bằng cách tạo các xác nhận mới.

Các kho lưu trữ trần chỉ được thay đổi bằng cách vận chuyển các thay đổi từ các kho khác.


10

Tôi chắc chắn không phải là một "chuyên gia" Git. Tôi đã sử dụng TortoiseGit được một thời gian và tự hỏi nó đang nói về điều gì khi nó hỏi tôi có muốn tạo một repo "trần" bất cứ khi nào tôi tạo ra nó không. Tôi đã đọc hướng dẫn này: https://www.atlassian.com/git/tutorials/setting-up-a-reposeective/git-init và nó giải quyết vấn đề, nhưng tôi vẫn chưa hiểu rõ về khái niệm này. Điều này đã giúp rất nhiều: http://bitflop.com/tutorials/git-bare-vs-non-bare-repose khu.html . Bây giờ, cái đầu tiên cũng có ý nghĩa!

Theo các nguồn này, tóm lại, một repo "trần" được sử dụng trên máy chủ nơi bạn muốn thiết lập một điểm phân phối. Nó không có ý định sử dụng trên máy cục bộ của bạn. Bạn thường đẩy các cam kết từ máy cục bộ của mình sang một repo trần trên một máy chủ từ xa và bạn và / hoặc những người khác kéo từ repo trần đó đến máy cục bộ của bạn. Vì vậy, repo lưu trữ / phân phối GitHub, Assembla, v.v. của bạn là một ví dụ trong đó một repo "trần" được tạo ra. Bạn sẽ tự làm một cái nếu bạn đang thiết lập "trung tâm chia sẻ" tương tự của riêng bạn.


Bây giờ tôi hiểu rồi
Fuseteam

9

Một repo Git mặc định / không trống chứa hai phần trạng thái:

  1. Một ảnh chụp của tất cả các tập tin trong kho lưu trữ (đây là những gì "cây làm việc" có nghĩa là trong Git biệt ngữ)
  2. Một lịch sử của tất cả các thay đổi được thực cho tất cả các tập tin mà đã từng ở trong các kho lưu trữ (có vẻ không phải là một mảnh ngắn gọn của Git biệt ngữ mà bao gồm tất cả những điều này)

Các ảnh chụp là những gì bạn có thể nghĩ đến như dự án của bạn: tập tin của bạn mã, xây dựng tác phẩm, kịch bản helper, và bất cứ điều gì khác mà bạn phiên bản với Git.

Các lịch sử là tiểu bang cho phép bạn kiểm tra phạm khác nhau và nhận được một bản chụp tất cả những gì các tập tin trong kho của bạn trông giống như khi điều đó cam kết đã được bổ sung. Nó bao gồm một loạt các cấu trúc dữ liệu bên trong Git mà có lẽ bạn chưa bao giờ tương tác trực tiếp. Điều quan trọng, lịch sử không chỉ lưu trữ siêu dữ liệu (ví dụ: "Người dùng U đã thêm nhiều dòng này vào Tệp F tại Time T như một phần của Cam kết C"), nó cũng lưu trữ dữ liệu (ví dụ: "Người dùng U đã thêm các dòng chính xác này vào Tệp F" ).

Ý tưởng chính của một kho lưu trữ trần là bạn thực sự không cần phải có ảnh chụp nhanh. Git giữ ảnh chụp nhanh xung quanh vì nó thuận tiện cho con người và các quá trình không phải Git khác muốn tương tác với mã của bạn, nhưng ảnh chụp nhanh chỉ là sao chép trạng thái đã có trong lịch sử.

Một kho trần là một kho Git mà không có một bản chụp. Nó chỉ lưu trữ lịch sử.

Tại sao bạn muốn điều này? Chà, nếu bạn chỉ tương tác với các tệp của mình bằng Git (nghĩa là bạn sẽ không chỉnh sửa trực tiếp các tệp của mình hoặc sử dụng chúng để xây dựng một tệp thực thi), bạn có thể tiết kiệm dung lượng bằng cách không giữ ảnh chụp nhanh. Đặc biệt, nếu bạn đang duy trì một phiên bản tập trung của repo của mình trên một máy chủ ở đâu đó (nghĩa là về cơ bản bạn đang lưu trữ GitHub của riêng bạn), thì máy chủ đó có thể nên có một repo trần (bạn vẫn sẽ sử dụng repo không trần trên mặc dù máy cục bộ, vì có lẽ bạn sẽ muốn chỉnh sửa ảnh chụp nhanh của mình).

Nếu bạn muốn giải thích sâu hơn về repos trần và trường hợp sử dụng ví dụ khác, tôi đã viết một bài đăng blog ở đây: https://stegosaurusdormant.com/bare-git-repo/


4

Đây không phải là một câu trả lời mới, nhưng nó giúp tôi hiểu các khía cạnh khác nhau của các câu trả lời ở trên (và nó quá nhiều cho một nhận xét).

Sử dụng Git Bash chỉ cần thử:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init
Initialized empty Git repository in C:/Test/.git/

me@pc MINGW64 /c/Test (master)
$ ls -al
total 20
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 .git/

me@pc MINGW64 /c/Test (master)
$ cd .git

me@pc MINGW64 /c/Test/.git (GIT_DIR!)
$ ls -al
total 15
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ../
-rw-r--r-- 1 myid 1049089 130 Apr  1 11:35 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:35 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:35 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 objects/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 refs/

Tương tự với git --bare:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init --bare
Initialized empty Git repository in C:/Test/

me@pc MINGW64 /c/Test (BARE:master)
$ ls -al
total 23
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:11 ../
-rw-r--r-- 1 myid 1049089 104 Apr  1 11:36 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:36 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:36 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 objects/

2

$ git help repository-layout

Kho lưu trữ Git có hai loại khác nhau:

  • một thư mục .git ở gốc của cây làm việc;
  • một thư mục .git là một kho lưu trữ trần (tức là không có cây làm việc riêng), thường được sử dụng để trao đổi lịch sử với người khác bằng cách đẩy vào đó và tìm nạp từ nó.
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.