2009-11-19 23 views
114

Tôi thường làm việc trên máy chủ từ xa thông qua ssh (màn hình và vim), nơi tôi có kho lưu trữ Git. Đôi khi tôi không trực tuyến, vì vậy tôi có một kho lưu trữ riêng biệt (nhân bản từ xa của tôi) trên máy tính xách tay của tôi.Làm cách nào để đẩy tới kho lưu trữ Git không trống?

Tuy nhiên, tôi không thể kéo từ kho lưu trữ này ở phía xa vì tôi thường ở phía sau tường lửa hoặc tôi không có IP công khai.

Tôi đã đọc rằng tôi chỉ nên chuyển đến kho lưu trữ trống. Làm thế nào tôi nên đẩy các thay đổi của tôi vào kho lưu trữ từ xa của tôi?

+0

liên quan: http://stackoverflow.com/questions/12265729/git-config-receive-denycurrentbranch – prusswan

+2

có 2 từ xa repos, một trần và bình thường, và sử dụng móc. có vẻ như một rắc rối, nhưng theo [git ready] (http://gitready.com/advanced/2009/02/01/push-to-only-bare-repositories.html) và [wiki chính thức] (https : //git.wiki.kernel.org/index.php? title = Git_FAQ & oldid = 23811 # Why_won.27t_I_see_changes_in_the_remote_repo_after_.22git_push.22.3F), bạn nên ** chỉ đẩy đến một repo trần **. điều này có lẽ là lý do tại sao hầu hết các host git repo (ví dụ GitHub, Bitbucket) bao gồm các móc sau khi nhận, vì vậy bạn có thể POST tới một URL trên máy chủ của bạn chạy một kịch bản thực thi ví dụ 'git pull github master'. –

Trả lời

69

receive.denyCurrentBranch updateInstead, thêm in Git 2.3, cũng cập nhật cây làm việc của máy chủ nếu nó sạch. Vì vậy, nếu bạn đảm bảo rằng bạn luôn cam kết trước khi bạn kéo cục bộ và giữ một cây làm việc sạch trên máy chủ (bạn nên làm gì để tránh có xung đột hợp nhất), thì tùy chọn này là một giải pháp tốt.

mẫu sử dụng:

git init server 
cd server 
touch a 
git add . 
git commit -m 0 
git config --local receive.denyCurrentBranch updateInstead 

cd .. 
git clone server local 
cd local 
touch b 
git add . 
git commit -m 1 
git push origin master:master 

cd ../server 
ls 

Output:

a 
b 
+6

Điều này thực sự phải là câu trả lời được chấp nhận. Nó siêu đơn giản và hoạt động rất tốt, như bạn mong đợi. Cảm ơn! – mav

+1

Cách tuyệt vời để đại diện cho –

+1

Giải pháp tốt giúp giữ mọi thứ như hiện trạng. –

140

lựa chọn tốt nhất

Có lẽ sạch, ít nhất là khó hiểu, và cách an toàn nhất để đẩy vào kho lưu trữ từ xa phi trần của bạn, là để thúc đẩy cho các chi nhánh chuyên dụng trong điều khiển từ xa mà đại diện cho chi nhánh máy tính xách tay của bạn.

Hãy xem xét trường hợp đơn giản nhất và giả sử bạn chỉ có một nhánh trong mỗi repo: master. Khi bạn đẩy đến repo từ xa từ máy tính xách tay của bạn, thay vì đẩy master -> master, push master -> laptop-master (hoặc tên tương tự). Bằng cách này, việc đẩy không ảnh hưởng đến nhánh chính hiện đã được kiểm tra trong repo từ xa. Để làm điều này từ máy tính xách tay, lệnh là khá đơn giản:

git push origin master:laptop-master 

Điều này có nghĩa rằng các chi nhánh tổng thể địa phương sẽ được đẩy đến chi nhánh có tên là "máy tính xách tay bị Thạc sỹ" trong kho lưu trữ từ xa. Trong repo từ xa của bạn, bạn sẽ có một chi nhánh mới có tên là "máy tính xách tay-master" mà sau đó bạn có thể hợp nhất vào chủ từ xa của bạn khi bạn đã sẵn sàng.

thay thế Lựa chọn

Nó cũng có thể chỉ đẩy master -> bậc thầy, nhưng đẩy đến chi nhánh hiện check-out của một repo phi trần thường không được khuyến khích, bởi vì nó có thể gây nhầm lẫn nếu bạn không hiểu chuyện gì đang diễn ra. Điều này là do việc đẩy vào một chi nhánh đã kiểm tra không cập nhật cây công việc, vì vậy việc kiểm tra git status trong chi nhánh đã được kiểm tra đã được đẩy vào sẽ cho thấy chính xác sự khác biệt đối nghịch với những gì gần đây nhất được đẩy. Nó sẽ trở nên đặc biệt khó hiểu nếu cây công việc bị bẩn trước khi đẩy được thực hiện, đó là một lý do lớn tại sao điều này không được khuyến khích.

Nếu bạn muốn thử chỉ đẩy master -> tổng thể, sau đó lệnh chỉ là:

git push origin 

Nhưng khi bạn quay trở lại repo từ xa, bạn sẽ rất có thể muốn làm một git reset --hard HEAD để làm cho cây công việc đồng bộ với nội dung đã được đẩy. Điều này có thể nguy hiểm, bởi vì nếu có bất kỳ các thay đổi không cam kết nào trong cây làm việc từ xa mà bạn muốn giữ nó sẽ xóa chúng. Hãy chắc chắn rằng bạn biết hậu quả của điều này là gì trước khi bạn thử nó, hoặc ít nhất là tạo một bản sao lưu trước!

EDIT Kể từ Git 2.3, bạn có thể sử dụng lệnh "push-to-deploy" git push: https://github.com/blog/1957-git-2-3-has-been-released. Nhưng đẩy vào một nhánh riêng biệt và sau đó hợp nhất thường tốt hơn vì nó thực sự hợp nhất (do đó làm việc với những thay đổi không được cam kết giống như việc hợp nhất).

+1

Có thể tự động phân nhánh sau khi đẩy máy tính xách tay không? – rdoubleui

+3

@rdoubleui: Ý của bạn là "tự động hóa * hợp nhất *"? Nếu vậy, không, không thể tự động hợp nhất vì các hợp nhất không được đảm bảo để có thể nếu không có sự can thiệp của con người. Có thể có các xung đột cần được sắp xếp. –

+0

Tôi có nghĩa là "tự động hóa việc hợp nhất", vâng. Cảm ơn, vẫn còn học hỏi. – rdoubleui

13

Tôi khuyên bạn nên có kho lưu trữ trống và một repos đang hoạt động (không phải trần) trong máy chủ của bạn. Bạn có thể đẩy các thay đổi từ máy tính xách tay đến máy chủ repo trần và sau đó kéo từ đó repo trần để máy chủ làm việc repo.Lý do tôi nói điều này là bởi vì bạn có thể có nhiều chi nhánh hoàn chỉnh/không đầy đủ trong máy chủ mà bạn sẽ muốn nhân rộng trên máy tính xách tay.

Bằng cách này bạn không phải lo lắng về trạng thái của chi nhánh đã kiểm tra trên máy chủ làm việc repo trong khi đẩy thay đổi cho máy chủ.

+0

Đơn giản như vậy. –

1

lựa chọn khác là để thiết lập một đường hầm ssh ngược để bạn có thể kéo thay vì đẩy.

# start the tunnel from the natted box you wish to pull from (local) 
$ ssh -R 1234:localhost:22 [email protected] 

# on the other box (remote) 
$ git remote add other-side ssh://[email protected]:1234/the/repo 
$ git pull other-side 

Và nếu bạn muốn đường hầm để chạy ở chế độ nền

$ ssh -fNnR 1234:localhost:22 [email protected] 
0

Bạn có thể làm:

$git config --bool core.bare true

này có thể được thực hiện trong kho trần hoặc trung tâm để nó sẽ chấp nhận bất kỳ tệp nào được đẩy từ kho không trống. Nếu bạn làm điều này trong kho không trống, chúng tôi không thể đẩy bất kỳ tập tin nào từ kho không trần đến trần.

Nếu bạn đang thực hành GIT bằng cách tạo repo trung tâm và không trần trong PC, nó có thể không hiển thị các tệp được đẩy trong một số máy tính nhưng nó đã bị đẩy. bạn có thể kiểm tra nó bằng cách chạy.

$git log trong repo trung tâm.

Khác với nếu bạn nhấn vào GitHub, nó sẽ hiển thị các tệp ở đó.

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