Làm thế nào để đẩy đến một kho Git không trần?


150

Tôi thường làm việc trên một máy chủ từ xa thông qua ssh (screen và vim), nơi tôi có một 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 (được nhân bản từ xa) trên máy tính xách tay của mình.

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

Tôi đã đọc rằng tôi nên đẩy chỉ vào một kho lưu trữ trần. 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?



3
có 2 repos từ xa, trần và bình thường, và sử dụng móc. Có vẻ như là một rắc rối, nhưng theo git sẵn sànggit wiki chính thức , bạn chỉ nên đẩy đến một repo trần . đây có lẽ là lý do tại sao hầu hết các máy chủ repo git (ví dụ: GitHub, Bitbucket) bao gồm các móc nhận sau, do đó bạn có thể POST vào một URL trên máy chủ của mình để chạy tập lệnh thực thi chẳng hạn git pull github master.
Jake Berger

Câu trả lời:


137

receive.denyCurrentBranch updateInstead

Tùy chọn này đã được thêm vào trong Git 2.3 và nó làm cho máy chủ cập nhật cây làm việc của nó 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 kéo cục bộ và giữ một cây làm việc sạch sẽ trên máy chủ (điều bạn nên làm để 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.

Sử dụng mẫu:

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

Đầu ra:

a
b

có thể đẩy mà không tạo ra một repo trần như heroku không
ANinJa

2
@ANinJa Tôi không hiểu, chẳng phải đó chính xác là ví dụ của tôi sao?
Ciro Santilli 郝海东 冠状 病 事件

--localtùy chọn?
Yukulélé

@ Yukulélé --localchỉ ảnh hưởng đến thư mục hiện tại, --globalảnh hưởng đến tất cả các repos git với ~/.gitconfig, xem man git-config.
Ciro Santilli 郝海东 冠状 病 事件

1
cảm ơn @CiroSantilli新疆改造中心六四事件法轮功sau khi đọc doc Tôi xác nhận rằng nó không phải là cần thiết "(bạn có thể nói --local nhưng đó là mặc định)"
Yukulélé

146

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

Có lẽ cách sạch nhất, ít gây nhầm lẫn và an toàn nhất để đẩy vào kho lưu trữ từ xa không trống của bạn, là đẩy đến các nhánh chuyên dụng trong điều khiển từ xa đại diện cho các 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, đẩy master -> laptop-master (hoặc một 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 đang được kiểm tra trong repo từ xa. Để làm điều này từ máy tính xách tay, lệnh khá đơn giản:

git push origin master:laptop-master

Điều này có nghĩa là nhánh chính cục bộ sẽ được đẩy đến nhánh có tên là "laptop-master" 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à "laptop-master" mà sau đó bạn có thể hợp nhất vào chủ từ xa khi bạn sẵn sàng.

Lựa chọn thay thế

Bạn cũng có thể chỉ cần đẩy master -> master, nhưng việc đẩy sang nhánh thanh toán hiện tại của một repo không 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 xảy ra. Điều này là do việc đẩy sang một nhánh thanh toán không cập nhật cây công việc, do đó, việc kiểm tra git statustrong nhánh thanh toán bị đẩy vào sẽ cho thấy chính xác những khác biệt ngược lại như những gì được đẩy gần đây nhất. Sẽ rất khó hiểu nếu cây công việc bị bẩn trước khi thực hiện việc đẩy, đó 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ỉ cần đẩy master -> master, thì lệnh chỉ là:

git push origin

Nhưng khi bạn quay lại repo từ xa, rất có thể bạn sẽ muốn thực hiện git reset --hard HEADđể có được 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ỳ sự cam kết nào thay đổi nào trong cây làm việc từ xa mà bạn muốn giữ thì nó sẽ xóa sạch chúng. Hãy chắc chắn rằng bạn biết hậu quả của việc này là gì trước khi bạn thử nó, hoặc ít nhất là tạo bản sao lưu trước!

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


1
Có thể tự động hóa việc phân nhánh sau khi đẩy laptop-master?
ndoubleui

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

7
trong các phiên bản sau (?), git config receive.denyCurrentBranch ignorephải được thực hiện trước khi đẩy sang repos không trần
prusswan

3
Câu trả lời tuyệt vời @DanMoulding, cảm ơn. @rdoubleui: bạn luôn có thể lưu một dòng lệnh như sau dưới dạng hàm bash:git push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
Rich

@rdoubleui để tự động hóa việc hợp nhất, bạn có thể sử dụng gitolite và thiết lập nó (hơi phức tạp) để làm cho mọi thứ không trần trụi mọi thứ bẩn thỉu và đẩy nó lên phiên bản gitolite (trần) bằng cách sử dụng kích hoạt pre-git. Sau đó, nếu việc hợp nhất không thể được giải quyết trong trường hợp không trần, nó sẽ từ chối sự thúc đẩy của bạn, vì vậy bạn biết rằng bạn phải kéo trước, giải quyết việc hợp nhất và đẩy lại. Tôi chưa thiết lập điều này, nhưng tôi đang trong quá trình và nghĩ rằng nó có thể hoạt động.

17

Tôi sẽ đề nghị có một kho lưu trữ trần và một kho lưu trữ làm việc cục bộ (không trống) 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 sang máy chủ repo trần và sau đó kéo từ repo trần đó sang 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 nhánh hoàn chỉnh / không hoàn chỉnh trong máy chủ mà bạn sẽ muốn sao chép 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 các thay đổi sang máy chủ.


4

Một tùy 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 user@remote

# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side

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

$ ssh -fNnR 1234:localhost:22 user@remote

1

Bạn có thể làm:

$git config --bool core.bare true

điều này có thể được thực hiện trong kho lưu trữ 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 lưu trữ không trống thì chúng tôi không thể đẩy bất kỳ tệp nào từ kho lưu trữ không trần sang 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ố PC 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 ở đó.

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.