Sử dụng git làm kho lưu trữ trung tâm


12

Tôi đã thiết lập git cho mục đích sử dụng của riêng mình - vì vậy tôi có thể truy cập dự án từ 'mọi nơi' và giữ an toàn phiên bản nếu tôi tình cờ làm việc ở phần X ở đây và phần Y ở đây và có thể hợp nhất nếu cần.

Tuy nhiên, chỉ một trong những máy phát triển của tôi có IP tĩnh. Bộ não của tôi bị kẹt trong chế độ CVS, vì vậy tôi đã cố gắng thiết lập git để máy đó trở thành máy chủ 'trung tâm' mà tất cả những người khác lấy từ đó.

Đây là loại công trình. Tôi có một loạt các máy AC thực hiện thao tác kéo từ 'chủ nhân' M. Họ thực hiện các thao tác git để gửi dữ liệu trở lại.

Vấn đề xảy ra nếu tôi phát triển trên bản gốc. Đầu tiên, tôi không thể tìm ra cách để repo trung tâm cung cấp phiên bản mới nhất mà không cần làm

git reset --hard HEAD

mà có vẻ hơi quá. Và nếu tôi thực hiện phát triển trên máy trung tâm trước khi đặt lại, tôi không chắc làm thế nào để hợp nhất nó với các thay đổi đã được đẩy lên.

Một cái gì đó về mô hình tinh thần của tôi là cách. Cứu giúp?


Khi bạn nói "master", bạn đang nói về kho chủ hay về nhánh chính?
innaM

kho lưu trữ chính
Alex Feinman

1
"Master" trong ngữ cảnh git thường là tên của nhánh mặc định.
innaM

cái này có lẽ thuộc về SO
Ken Liu

Câu trả lời:


30

Bạn muốn kho lưu trữ trung tâm của bạn để trần. Nói máy mà nó sống được đặt tên static:

$ ssh static git init --bare /git/myproject.git

Kho lưu trữ trần này là một điểm hẹn trung tâm: đó là để đẩy và kéo từ đó, không phát triển.

Phát triển của bạn trên bản sao của kho lưu trữ trung tâm:

$ cd ~/src
$ git clone static:/git/myproject.git

Ngay cả khi bạn đang ở trên static, làm việc trong một bản sao:

$ git clone /git/myproject.git

Mặc dù bạn là người duy nhất làm việc trên kho lưu trữ này, hãy tập thói quen thực hiện công việc của bạn về những gì tài liệu git gọi là các nhánh chủ đề . Một lợi ích ngay lập tức của việc này là nó giữ một bản gốc sạch , đó là bạn luôn có thể kéo từ nhánh chính trung tâm của mình vào bản gốc của kho lưu trữ cục bộ hiện tại mà không cần hợp nhất.

Ví dụ:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

Điều đó có vẻ không phải là một vấn đề lớn, nhưng nó cho phép bạn tự do rời khỏi dự án như được đại diện trên chi nhánh đó ở trạng thái chín một phần, hoặc nếu ý tưởng tuyệt vời của bạn hóa ra là một sự thất bại, bạn có thể dễ dàng vứt bỏ chi nhánh đó mà không cần phá vỡ bất cứ điều gì khác trong dự án của bạn đã làm việc trên các chi nhánh khác. Mulligans miễn phí vô hạn!

Có thể bạn về nhà tối hôm đó và thêm một tính năng mới. Sáng hôm sau, bạn

$ git checkout master
$ git pull

để cập nhật chủ địa phương của bạn để phản ánh những gì trong kho lưu trữ trung tâm.

Nhưng bây giờ hãy nói rằng bạn đã sửa lỗi foo và sẵn sàng đưa nó vào nhánh chính của bạn. Đầu tiên bạn muốn tích hợp nó với những thay đổi từ tối qua:

$ git checkout fix-bug-in-foo
$ git rebase master

Các rebaselệnh làm cho cái nhìn kho của bạn như thể bạn sửa lỗi foo trên đầu trang của tính năng mới đêm qua. (Đây là loại tương tự svn update, nhưng linh hoạt và mạnh mẽ hơn.)

Bây giờ để có được nó vào chủ trung tâm của bạn:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

Chúng tôi đã coi chủ là đặc biệt, nhưng đó chỉ là thông thường. Bạn có thể chia sẻ công việc trên các nhánh khác nhau của các kho lưu trữ khác nhau thông qua kho git staticmột cách dễ dàng.


1
Câu trả lời tuyệt vời, móng tay xuống tất cả các vấn đề trong tầm tay.
Dan Loewenherz

Cài đặt git của tôi không chấp nhận --bare như một tùy chọn để git init (phiên bản cũ ??), nhưng tôi đã làm việc xung quanh nó bằng cách sao chép - mua lại repo hiện tại của mình, sau đó chỉnh sửa thủ công các tệp cấu hình một chút.
Alex Feinman

Nếu bạn đang chạy git 1.6.4.x, thì git init --barekhông có đối số nào khác. Nó sẽ sử dụng thư mục làm việc hiện tại hoặc cài đặt môi trường GIT_DIR nếu được đặt. Tôi tin rằng bạn cần git 1.6.5.x cho nó để lấy một đối số thư mục.
Hội trường Darren

4
Đó là lời giải thích quy trình công việc tốt nhất mà tôi đã thấy cho đến nay cho công việc tôi đang làm.
Greg Graham

8

Nếu bạn có một máy chủ trung tâm với kho lưu trữ git trung tâm, kho lưu trữ đó sẽ là một barekho lưu trữ. Các kho lưu trữ trống không có bản sao làm việc của các tệp trong đó. Do đó, nếu bạn đang làm việc trên máy trung tâm đó, bạn không làm việc trực tiếp với kho lưu trữ trung tâm mà chỉ với một bản sao cục bộ.


6

Câu trả lời này tương tự như câu trả lời của gbacon , nhưng có một cách tiếp cận rằng bạn đã có một thiết lập repo cục bộ và muốn tạo một chủ từ xa được coi là một repo trung tâm. Nó chỉ thêm chi tiết từ một cách tiếp cận khác.

Tôi sử dụng git để lưu trữ các tập tin dot-config của tôi. Tôi đẩy và kéo từ cái mà tôi coi là 'repo trung tâm'. Thật tiện lợi khi đặt lại tất cả các tệp chấm của tôi thông qua nhiều máy tính.

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

Điều này tạo ra một repo trống rỗng trên trang web repo.

Bây giờ nếu tôi đã có một repo hiện có tại địa phương, tôi có thể đẩy nó đến trang web từ xa.

$ cd ~/src/dotconf

chdir vào thư mục địa phương.

$ git remote add origin ssh://example.com/~/dotconf.git

Thêm repo từ xa làm gốc, vì vậy đẩy / kéo sẽ tác động lên repo đó.

$ git push origin master

Đẩy chủ của tôi đến điểm gốc (như được dán nhãn trước đó thông qua git remote). Bây giờ repo từ xa được coi là 'repo trung tâm' của tôi. Tất cả git đẩy / kéo của tôi sẽ tương tác với nguồn gốc.

Nếu tôi đi đến một máy chủ khác, tôi có thể dễ dàng kéo qua bản sao mà repo đến một vị trí mới.

$ git clone ssh://example.com/~/dotconf.git

Nếu tôi muốn thực hiện phát triển TRÊN máy chủ từ xa, tôi sẽ sao chép trước, sau đó đẩy / kéo trở lại vào repo trần.

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

Bạn có thể sẽ phải thiết lập git config --add branch.master.remote originđể git pullkhông phàn nàn rằng bạn không đủ cụ thể. Cách khác là đặt nhánh chính của bạn --trackthành gốc từ xa. Hữu ích nếu bạn có nhiều chi nhánh.


1

Tôi chỉ đang nghiên cứu vấn đề tương tự ngày hôm nay. Blog này bài có rất nhiều cuộc thảo luận về vấn đề này, nhưng đa số ý kiến là để làm gì Manni nói. Nhìn vào một bình luận trên bài đăng của David French để biết một số khả năng khác, bao gồm những việc cần làm nếu bạn kết thúc nhầm vào một kho lưu trữ có công việc không được cam kết trong chỉ mục hoặc cây làm việc. "git thiết lập lại chương trình ĐẦU TIÊN ^" sẽ sao lưu thay đổi được đẩy mà không làm phiền công việc của bạn.


2
Một vấn đề với bài đăng trên blog đó là bỏ qua tính hữu ích của chỉ mục. Đây là một bài viết tốt để giải thích cách làm việc với git thay vì mặc dù git - Osteele.com/archives/2008/05/my-git-workflow - sơ đồ quy trình làm việc được bao gồm.
Hội trường Darren
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.