Lỗi đẩy Git '[từ chối] master -> master (nhánh hiện đang được kiểm tra)'


961

Hôm qua, tôi đã đăng một câu hỏi về cách sao chép kho lưu trữ Git từ một trong các máy của tôi sang máy khác, Làm cách nào tôi có thể "nhân bản" từ một máy khác? .

Bây giờ tôi có thể sao chép thành công kho lưu trữ Git từ nguồn của mình (192.168.1.2) đến đích (192.168.1.1).

Nhưng khi tôi thực hiện chỉnh sửa tệp, a git commit -a -m "test"và a git push, tôi gặp lỗi này ở đích (192.168.1.1):

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

Tôi đang sử dụng hai phiên bản Git khác nhau (1.7 trên điều khiển từ xa và 1.5 trên máy cục bộ). Đó có phải là một lý do có thể?


5
Bất kỳ bộ đếm thời gian cũ nào có thể thay đổi câu trả lời được chấp nhận thành stackoverflow.com/a/9283833/397872 và di chuyển chuỗi để lưu trữ hoặc một cái gì đó? Hoặc thay đổi quyền sở hữu hoặc bất cứ điều gì?
rishta

9
Bây giờ bạn thực sự có một cách an toàn để chuyển sang repo không trần với Git 2.3.0 (tháng 2 năm 2015) và git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309
VonC

Đó là liên kết mới của cuốn sách mà @stigi đã đề cập: git-scm.com/book/en/v1/Git-on-the-Server
Abdelilah El Aissaoui


Nhưng tôi không hiểu tại sao và làm thế nào nó hoạt động? Nó hoạt động, Có nhưng đó là tất cả.
Tilak Maddy

Câu trả lời:


1149

Bạn chỉ có thể chuyển đổi kho lưu trữ từ xa của mình sang kho lưu trữ trần (không có bản sao hoạt động trong kho lưu trữ trần - thư mục chỉ chứa dữ liệu lưu trữ thực tế).

Thực hiện lệnh sau trong thư mục kho lưu trữ từ xa của bạn:

git config --bool core.bare true

Sau đó xóa tất cả các tập tin ngoại trừ .gittrong thư mục đó. Và sau đó bạn sẽ có thể thực hiện git pushvới kho lưu trữ từ xa mà không có bất kỳ lỗi nào.


4
Cảm ơn. Tôi cũng cần điều này. Tôi đã theo dõi hướng dẫn mô hình con từ Sách cộng đồng Git và đạt được rào cản này.
Shiki

6
Tôi không chắc liệu bạn có ý định xóa các tệp trên máy chủ hay máy khách ... vì vậy tôi đã không xóa bất cứ thứ gì và vấn đề sẽ biến mất sau khi thực hiện git config --bool core.bare true. Có bất kỳ lý do cụ thể một số tập tin cần phải được xóa? Nếu vậy, bạn có thể chính xác hơn về những gì cần phải xóa?
Brian Vandenberg

24
Đó là câu trả lời tốt nhất có thể và không ai khác đã cung cấp nó trong lỗ Interwebs. Tôi nghĩ rằng tất cả chúng ta đều đã thông báo cùng một thông báo lỗi và tất cả chúng ta đều vô cùng hạnh phúc khi đọc nó.
Sebastián Grignoli

40
Mặc dù nó nhận được rất nhiều phiếu bầu, tôi không nghĩ rằng đây là một câu trả lời thực sự đầy đủ cho câu hỏi cụ thể đó. Hướng dẫn người dùng cách tạo sạch một repo trần sẽ tệ bằng một nửa, nhưng nếu các tệp cần được kiểm tra, ví dụ như khi đó là kho lưu trữ mà người dùng đang làm việc trên hai máy tính thì sao?
Không ở đâu người đàn ông

9
Thay đổi repo nguồn thành trần là quá mức cần thiết. Tất cả những gì bạn cần làm là đẩy sang một nhánh mới trong repo nguồn, như @Robert chỉ ra: stackoverflow.com/a/2933656/402949 .
Dan Solovay

708

Tôi chỉ có lỗi tương tự trong khi tôi bắt đầu học Git . Một số câu trả lời khác rõ ràng không dành cho người mới biết về Git!

.

Ngay bây giờ bạn đang ở trong kho lưu trữ công việc của mình và đang sử dụng nhánh "chính". Nhưng bạn cũng tình cờ được "đăng nhập" vào kho lưu trữ ban đầu của mình đến cùng nhánh "chính". Bây giờ vì bạn đã "đăng nhập" vào bản gốc, Git lo sợ bạn có thể gây rối vì bạn có thể đang làm việc với bản gốc và làm hỏng mọi thứ. Vì vậy, bạn cần quay trở lại kho lưu trữ ban đầu và thực hiện "git checkout sometherbranch", và bây giờ bạn có thể đẩy mà không gặp vấn đề gì.

Tôi hi vọng cái này giúp được.


76
+1 Hữu ích hơn nhiều, cảm ơn bạn Robert. Tôi đã không có ý nghĩa để chuyển đổi sang một repo trần trong trường hợp của tôi. Đơn giản chỉ cần 'hủy kích hoạt' chi nhánh mà bạn đang cố gắng đẩy tới. Có ý nghĩa.
Eric Muyser

32
@ FMaz008: chỉ cần tạo một nhánh giả (git checkout -b dummy)
Dror Cohen

14
Man này là tốt hơn nhiều so với hầu hết các câu trả lời bình chọn :) Cảm ơn. Mặc dù câu trả lời khác cũng có điểm tốt :)
Ivan Ivanić

103
Chỉ cần làm cho điều này rõ ràng hơn, trong repo đó là mục tiêu của sự thúc đẩy : git checkout -b tmp. Sau đó trong repo nguồn : git push. Sau đó quay lại mục tiêu (tùy chọn):git checkout master; git branch -d tmp
Hari Karam Singh

18
Nhận xét của Hari là công thức đơn giản nhất. Tôi chỉ cần nói rằng trong khi git có thể tuyệt vời theo nhiều cách, đến từ svn hoặc có thể là bất kỳ rvs nào khác, toàn bộ điều này là tuyệt vời không trực quan.
Vô điều kiệnReinstateMonica

128

Thông báo lỗi mô tả những gì đã xảy ra. Các phiên bản hiện đại hơn của Git từ chối cập nhật một chi nhánh thông qua một cú đẩy nếu chi nhánh đó được kiểm tra.

Cách dễ nhất để làm việc giữa hai kho lưu trữ không phải là

  1. luôn cập nhật các kho lưu trữ bằng cách kéo (hoặc tìm nạp và hợp nhất) hoặc, nếu bạn phải,

  2. bằng cách đẩy sang một nhánh riêng (một nhánh nhập) và sau đó hợp nhất nhánh đó vào nhánh chính trên máy từ xa.

Lý do cho sự hạn chế này là do hoạt động đẩy chỉ hoạt động trên kho Git từ xa, nó không có quyền truy cập vào chỉ mục và cây làm việc. Vì vậy, nếu được phép, một cú đẩy trên nhánh đã kiểm tra sẽ thay đổi sự HEAD không phù hợp với chỉ mục và cây làm việc trên kho lưu trữ từ xa.

Điều này sẽ giúp dễ dàng vô tình thực hiện một thay đổi hoàn tác tất cả các thay đổi được đẩy và cũng rất khó phân biệt giữa bất kỳ thay đổi cục bộ nào chưa được cam kết và sự khác biệt giữa mới HEAD, chỉ mục và cây làm việc đã được gây ra bởi đẩy di chuyển HEAD.


1
Cảm ơn. Vì vậy, làm thế nào tôi có thể khắc phục vấn đề của tôi? Trong hộp 192 của tôi, tôi đã làm '$ cd (thư mục dự án) $ git init $ (thêm một số tệp) $ git add.' và sau đó trong hộp 191 của tôi, tôi đã thực hiện một 'git clone' và chỉnh sửa một số tệp và hơn là cố gắng 'git đẩy'.
hap497

16
Vâng, tôi đã mô tả các khả năng trong câu trả lời của tôi. Hoặc bạn có thể đi đến hộp 192 và tìm nạp từ hộp 191 (bạn có thể muốn thêm hộp 191 dưới dạng từ xa có tên - nhìn vào git remote add box191 <191url>) hoặc bạn có thể đẩy từ hộp 191 sang một nhánh có tên khác (ví dụ git push origin master:refs/heads/upload), sau đó vào hộp 192 và hợp nhất (ví dụ git merge upload).
CB Bailey

3
Bây giờ bạn thực sự có một cách an toàn để chuyển sang repo không trần với Git 2.3.0 (tháng 2 năm 2015) và git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309 : bạn không cần tùy chọn 2 nữa.
VonC

122

Tóm lược

Bạn không thể đẩy đến một nhánh đã kiểm tra của kho lưu trữ vì nó sẽ gây rối với người dùng của kho lưu trữ đó theo cách có thể sẽ kết thúc với việc mất dữ liệu và lịch sử . Nhưng bạn có thể đẩy đến bất kỳ chi nhánh nào khác của cùng một kho lưu trữ.

Vì kho lưu trữ trần không bao giờ có bất kỳ chi nhánh nào được kiểm tra, bạn luôn có thể đẩy đến bất kỳ chi nhánh nào của kho lưu trữ trần.

Có nhiều giải pháp, tùy thuộc vào nhu cầu của bạn.

Giải pháp 1: Sử dụng Repostiory Bare

Theo đề xuất, nếu trên một máy, bạn không cần thư mục làm việc, bạn có thể chuyển sang kho lưu trữ trống. Để tránh gây rối với kho lưu trữ, bạn chỉ cần sao chép nó:

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo

Bây giờ bạn có thể đẩy tất cả những gì bạn muốn đến cùng một địa chỉ như trước đây.

Giải pháp 2: Đẩy đến một chi nhánh không được kiểm tra

Nhưng nếu bạn cần kiểm tra mã trên điều khiển từ xa <remote>, thì bạn có thể sử dụng một nhánh đặc biệt để đẩy. Giả sử trong kho lưu trữ cục bộ của bạn, bạn đã gọi từ xa originvà bạn đang ở trên nhánh chính. Sau đó bạn có thể làm

machine2$ git push origin master:master+machine2

Sau đó, bạn cần hợp nhất nó khi bạn ở trong originrepo từ xa:

machine1$ git merge master+machine2

Khám nghiệm tử thi

Khi một chi nhánh được kiểm tra, cam kết sẽ thêm một cam kết mới với đầu của chi nhánh hiện tại làm cha mẹ của nó và di chuyển đầu của chi nhánh thành cam kết mới đó.

Vì thế

A ← B
    ↑
[HEAD,branch1]

trở thành

A ← B ← C
        ↑
    [HEAD,branch1]

Nhưng nếu ai đó có thể đẩy vào nhánh đó ở giữa, người dùng sẽ tự nhận được trong chế độ đầu git tách ra :

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

Bây giờ người dùng không còn ở nhánh 1 nữa, mà không yêu cầu rõ ràng để kiểm tra một nhánh khác. Tồi tệ hơn, người dùng hiện đang ở bên ngoài bất kỳ chi nhánh nào và mọi cam kết mới sẽ bị treo lủng lẳng :

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

Theo giả thuyết, nếu tại thời điểm này, người dùng kiểm tra một chi nhánh khác, thì cam kết lơ lửng này sẽ trở thành trò chơi công bằng cho người thu gom rác của Git .


3
Một sửa chữa kỹ thuật để "khám nghiệm tử thi": git sẽ không thực sự tách ra HEADtrong kho lưu trữ được đẩy lên. HEADvẫn sẽ trỏ đến nhánh và nhánh sẽ lần lượt trỏ đến (các) cam kết mới được đẩy; nhưng thư mục làm việc và chỉ mục / khu vực tổ chức sẽ không được sửa đổi. Bất cứ ai đang làm việc trên kho lưu trữ được đẩy lên đều phải nỗ lực để phục hồi từ các tác động của việc đẩy: tìm hiểu xem có bất kỳ thay đổi nào để lưu hay không và nếu cẩn thận sắp xếp để lưu chúng.

Để thêm thông tin bổ sung vào câu trả lời của bạn, có rất ít lý do tại sao bạn muốn có một kho lưu trữ từ xa mà mọi người cố gắng để không trống, vì vậy sử dụng một kho lưu trữ trần là giải pháp tốt nhất.

2
Trên thực tế, tôi đã tìm thấy nhiều tình huống khi tôi cần đẩy vào một kho lưu trữ không trống và tôi sử dụng giải pháp 2 khá nhiều. Ngoài ra, nhánh mà tôi đẩy vào kho lưu trữ không phải là một nhánh tạm thời, nó phục vụ một mục đích tương tự như một nhánh theo dõi từ xa.
Người đàn ông hư không

Tôi đã tạo một thư mục GIT trong máy chủ của mình, nơi sẽ lưu trữ TẤT CẢ các kho lưu trữ được tạo bởi nhiều người dùng bằng SourceTree. Tôi đã tạo một masterkho lưu trữ trong PC cục bộ của tôi. Tôi đã thêm remotesthư mục máy chủ và cố gắng đẩy kho lưu trữ của mình vào máy chủ để người dùng khác có thể kéo / tìm nạp nó để hoạt động. Tôi nhận được lỗi sau: ! [remote rejected] master -> master (branch is currently checked out)Làm thế nào tôi có thể kiểm tra nó?
SearchForKnowledge

1
@SearchForKnowledge, bạn có nhận ra bạn đang hỏi chính xác câu hỏi tôi đang trả lời không?!
Không ở đâu người đàn ông

65

Bạn có thể khắc phục "giới hạn" này bằng cách chỉnh sửa .git/configmáy chủ đích. Thêm vào đây để cho phép một kho lưu trữ git được đẩy đến ngay cả khi nó được "kiểm tra":

[receive]
denyCurrentBranch = warn

hoặc là

[receive]
denyCurrentBranch = false

Cái đầu tiên sẽ cho phép đẩy trong khi cảnh báo về khả năng làm rối nhánh, trong khi cái thứ hai sẽ chỉ lặng lẽ cho phép nó.

Điều này có thể được sử dụng để "triển khai" mã đến một máy chủ không nhằm mục đích chỉnh sửa. Đây không phải là cách tiếp cận tốt nhất, nhưng là một cách nhanh chóng để triển khai mã.


7
Sử dụng điều này để "triển khai" mã đến một máy chủ sẽ không hoạt động. Ngay cả khi bạn vô hiệu hóa cảnh báo để bạn có thể đẩy đến nhánh đã kiểm tra, bản sao làm việc KHÔNG BAO GIỜ được cập nhật khi đẩy.
Arrowmaster

10
Tôi đang sử dụng phương pháp trên với cd .. && git reset --hardhook sau nhận để triển khai. Hackish, nhưng hoạt động.
jholster

9
phiên bản dòng lệnh của cái sau sẽ làgit config receive.denyCurrentBranch warn
Andre Holzner

4
Đây phải là câu trả lời được chấp nhận. Một số người trong chúng ta biết những gì chúng ta đang làm và không phải là người mới bắt đầu Git. Đây là câu trả lời cho những người đó.
Qix - MONICA ĐƯỢC PHÂN PHỐI

2
Ha, nhưng câu hỏi không được hỏi bởi những người đó.
Người đàn ông hư không

46

git config --local receive.denyCurrentBranch updateInstead

https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

Sử dụng nó trên kho lưu trữ của máy chủ và nó cũng cập nhật cây làm việc nếu không có ghi đè không được ghi đè sẽ xảy ra.

Nó đã được thêm vào Git 2.3 như được đề cập bởi VonC trong các bình luận.

Tôi đã biên soạn Git 2.3 và dùng thử. 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

Yay, bđã bị đẩy!


@VonC cảm ơn! Đó là nỗi ám ảnh của tôi với những ví dụ tối thiểu tại nơi làm việc :-)
Ciro Santilli 冠状 病毒 审查 六四

Điều này có bất kỳ vấn đề nào với việc cam kết thay đổi không cập nhật với máy chủ không?
akozi

@akozi Tôi không chắc ý của bạn là gì, nếu bạn cam kết cục bộ trước khi kéo, nó sẽ hoạt động chính xác như một --barebản sao truyền thống mà tôi nghĩ: --forcebắt buộc phải đẩy và nó sẽ khiến bạn "mất" cam kết trên điều khiển từ xa.
Ciro Santilli 冠状 病毒 审查 事件

1
@CiroSantilli 心 心 Không phải lo lắng bây giờ. Tôi tìm kiếm ý nghĩa của các tùy chọn. Tôi nghĩ rằng updateInstead đồng nghĩa với lực lượng.
akozi

updateInstead không còn là giá trị hợp lệ cho
receive.denyCienBranch

41

Tôi thích ý tưởng vẫn có một kho lưu trữ có thể sử dụng trên hộp từ xa, nhưng thay vì một nhánh giả, tôi thích sử dụng:

git checkout --detach

Đây dường như là một tính năng rất mới của Git - Tôi đang sử dụng phiên bản git 1.7.7.4.


8
Và sau khi đẩy các thay đổi của bạn, bạn có thể sử dụng: git checkout masterđể quay lại nhánh chính. Chỉ sau đó những thay đổi của bạn đang được áp dụng.
MAZDAK

30

Tôi gặp vấn đề tương tự. Đối với tôi, tôi sử dụng Git đẩy để di chuyển mã đến các máy chủ của mình. Tôi không bao giờ thay đổi mã ở phía máy chủ, vì vậy điều này là an toàn.

Trong kho lưu trữ, bạn đang đẩy để gõ:

git config receive.denyCurrentBranch ignore

Điều này sẽ cho phép bạn thay đổi kho lưu trữ trong khi đó là bản sao hoạt động.

Sau khi bạn chạy Git đẩy, hãy đi đến máy từ xa và nhập:

git checkout -f

Điều này sẽ làm cho những thay đổi bạn đẩy được phản ánh trong bản sao làm việc của máy từ xa.

Xin lưu ý, điều này không phải lúc nào cũng an toàn nếu bạn thay đổi trong bản sao làm việc mà bạn đang cố gắng.


cảm ơn một bản ghi, tôi hợp nhất đề xuất của bạn denyCurrentBranchvà đặt git checkout -fvào hooksthư mục như @ jack-senechal được đăng ở đây
Éderson T. Szlachta

Có cách nào để làm cho các tệp xuất hiện trên kho lưu trữ Remote mà không cần đến nó và thực hiện lệnh này không? Cụ thể bởi một lệnh từ địa phương?
Royi

24

Bạn có thể tạo lại kho lưu trữ máy chủ của mình và đẩy từ chủ chi nhánh địa phương sang chủ máy chủ.

Trên máy chủ từ xa của bạn:

mkdir myrepo.git
cd myrepo.git
git init --bare

OK, từ chi nhánh địa phương của bạn:

git push origin master:master

3
Cảm ơn đây là giải pháp cho tôi vì tôi đã bỏ qua '--bare' trên máy chủ từ xa. Có vẻ như câu trả lời cho câu hỏi này phụ thuộc vào việc bạn có đang sử dụng repo máy chủ từ xa làm thư mục làm việc hay không và trong trường hợp sau, đây là câu trả lời đúng.
Cas

2
Tôi không hiểu: SI đã cố gắng tạo và sao chép một repo trần, nhưng sao chép không tải được gì và đẩy không tải lên, vì vậy điều này không hiệu quả ... :-) Tôi đọc hướng dẫn về repos trần, nhưng họ nói rằng đó là một repo trần không chứa tập tin ... Đó chắc chắn không phải là thứ tôi đang tìm kiếm ...
inf3rno

22

Những gì bạn có thể đã làm để gây ra điều này:

Điều này xảy ra khi bạn đi ra một chương trình nhỏ. Bạn sắp thay đổi thứ gì đó đã hoạt động, vì vậy bạn đã sử dụng phép thuật cấp 3 không thể xóa được vĩnh viễn:

machine1:~/proj1> git init

và bạn bắt đầu thêm / cam kết. Nhưng sau đó , dự án bắt đầu tham gia nhiều hơn và bạn muốn làm việc trên nó từ một máy tính khác (như PC hoặc máy tính xách tay ở nhà của bạn), vì vậy bạn làm một cái gì đó như

machine2:~> git clone ssh://machine1/~/proj1

và nó nhân bản và mọi thứ có vẻ tốt, và vì vậy bạn làm việc với mã của mình từ machine2.

Sau đó ... bạn cố gắng đẩy các cam kết của mình từ machine2 và bạn nhận được thông báo cảnh báo trong tiêu đề.

Lý do cho thông báo này là vì git repo mà bạn đã lấy từ đó được dự định sẽ chỉ được sử dụng cho thư mục đó trên máy1. Bạn có thể nhân bản từ nó tốt, nhưng đẩy có thể gây ra vấn đề. Cách "thích hợp" để quản lý mã ở hai vị trí khác nhau là với một repo "trần", giống như đã được đề xuất. Một repo trần không được thiết kế để có bất kỳ công việc nào được thực hiện trong đó, nó có nghĩa là phối hợp các cam kết từ nhiều nguồn. Đây là lý do tại sao câu trả lời được xếp hạng hàng đầu đề nghị xóa tất cả các tệp / thư mục khác với thư mục .git sau bạn git config --bool core.bare true.

Làm rõ câu trả lời được xếp hạng cao nhất: Nhiều ý kiến ​​cho câu trả lời đó có nội dung như "Tôi đã không xóa các tệp không phải .git khỏi máy1 và tôi vẫn có thể cam kết từ máy2". Đúng rồi. Tuy nhiên, bây giờ những tập tin khác đã hoàn toàn "ly dị" với repo git. Hãy thử git statustrong đó và bạn sẽ thấy một cái gì đó như "gây tử vong: Thao tác này phải được chạy trong một cây làm việc". Vì vậy, đề xuất xóa các tệp không phải để cam kết từ machine2 sẽ hoạt động ; để bạn không bị nhầm lẫn và nghĩ rằng git vẫn đang theo dõi các tệp đó. Nhưng, xóa các tệp là một vấn đề nếu bạn vẫn muốn làm việc với các tệp trên máy1, phải không?

Vì vậy, bạn thực sự nên làm gì?

Phụ thuộc vào mức độ bạn dự định vẫn hoạt động trên máy1 và máy2 ...

Nếu bạn đã hoàn tất việc phát triển từ machine1 và đã chuyển tất cả sự phát triển của mình sang machine2 ... chỉ cần làm những gì câu trả lời được xếp hạng cao nhất gợi ý: git config --bool core.bare truevà sau đó, tùy chọn, xóa tất cả các tệp / thư mục khác ngoài .git khỏi thư mục đó, vì chúng Không bị theo dõi và có thể gây nhầm lẫn.

Nếu công việc của bạn trên machine2 chỉ là việc một lần và bạn không cần tiếp tục phát triển ở đó ... thì đừng bận tâm đến việc tạo ra một repo trần; chỉ cần ftp / rsync / scp / vv. các tệp của bạn từ máy * 2 * ở trên cùng của các tệp trên máy * 1 *, cam kết / đẩy từ máy * 1 *, sau đó xóa các tệp khỏi máy * 2 *. Những người khác đã đề nghị tạo một chi nhánh, nhưng tôi nghĩ rằng điều đó hơi lộn xộn nếu bạn chỉ muốn hợp nhất một số phát triển bạn đã làm trên cơ sở một lần từ một máy khác.

Nếu bạn cần tiếp tục phát triển trên cả machine1 và machine2 ... thì bạn cần thiết lập mọi thứ đúng cách. Bạn cần chuyển đổi repo của mình thành trần, sau đó bạn cần tạo một bản sao của nó trên máy1 để bạn làm việc . Có lẽ cách nhanh nhất để làm điều này là làm

machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1

Rất quan trọng: vì bạn đã chuyển vị trí của repo từ proj1 sang proj1.git, bạn cần cập nhật tệp này trong tệp .git / config trên machine2 . Sau đó, bạn có thể cam kết thay đổi của mình từ machine2. Cuối cùng, tôi cố gắng giữ các repos trần của mình ở một vị trí trung tâm, cách xa cây làm việc của tôi (tức là không đặt 'proj1.git' trong cùng thư mục gốc là 'proj1'). Tôi khuyên bạn nên làm như vậy, nhưng tôi muốn giữ các bước trên đơn giản nhất có thể.


Rất chi tiết và hữu ích. Trường hợp của tôi là trường hợp cuối cùng, và hướng dẫn của bạn hoạt động như một cơ duyên.
pojda

Tôi đang ở trường hợp 3 và tôi đã làm một cái gì đó hơi khác: mk git-server; mv .git git-server / proj.git và sau đó git clone git-server / proj.git cho cả 1 và 2 (hoặc git remote origin ...), sử dụng tiền tố ssh: // thích hợp cho máy 2. Cách này Tôi sẽ giữ một bản sao chính sẽ giống như bản thường trên GH hoặc máy chủ HTTP khác và tôi sẽ tiếp tục sử dụng đẩy / kéo trên cả hai máy.
zakmck

18

Với một vài bước thiết lập, bạn có thể dễ dàng triển khai các thay đổi cho trang web của mình bằng cách sử dụng một lớp lót như

git push production

Điều này thật hay và đơn giản, và bạn không cần phải đăng nhập vào máy chủ từ xa và thực hiện thao tác kéo hay bất cứ thứ gì. Lưu ý rằng điều này sẽ hoạt động tốt nhất nếu bạn không sử dụng thanh toán sản xuất của mình làm chi nhánh hoạt động! (OP đã làm việc trong một bối cảnh hơi khác và tôi nghĩ rằng giải pháp của @Robert Gould đã giải quyết tốt. Giải pháp này phù hợp hơn để triển khai đến một máy chủ từ xa.)

Trước tiên, bạn cần thiết lập một kho lưu trữ trống ở đâu đó trên máy chủ của bạn, bên ngoài webroot của bạn.

mkdir mywebsite.git
cd mywebsite.git
git init --bare

Sau đó tạo tập tin hooks/post-receive:

#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

Và làm cho tập tin thực thi:

chmod +x hooks/post-receive

Trên máy cục bộ của bạn,

git remote add production git@myserver.com:mywebsite.git
git push production +master:refs/heads/master

Tất cả các thiết lập! Bây giờ trong tương lai bạn có thể sử dụng git push productionđể triển khai các thay đổi của mình!

Tín dụng cho giải pháp này được gửi tới http://sebduggan.com/blog/deploy-your-website-changes-USE-git/ . Nhìn vào đó để giải thích chi tiết hơn về những gì đang xảy ra.


Gợi ý của bạn đã giúp tôi rất nhiều, nhưng tôi đã không sử dụng bare, tôi làm theo này và kết hợp với hooks(mà bạn đề nghị) và làm việc một cách hoàn hảo.
Éderson T. Szlachta

11

Bạn chỉ nên đẩy đến một kho lưu trữ trần. Một kho lưu trữ trần là một kho lưu trữ không có chi nhánh kiểm tra. Nếu bạn đã chuyển sang thư mục kho lưu trữ trống, bạn sẽ chỉ thấy nội dung của thư mục .git.


9
Không có gì sai khi đẩy đến một chi nhánh không được kiểm tra trong một kho lưu trữ không trống. Đây là một cách làm việc hoàn toàn hợp lệ.
CB Bailey

Đủ công bằng, điều đó sẽ làm việc. Nhưng đó không phải là những gì người dùng đang làm.
RibaldEddie

13
Đó không phải là thực tế rằng anh ta không sử dụng một kho lưu trữ trần là 'sai'; thực tế là anh ta đang đẩy đến một chi nhánh đã được kiểm tra. Không có bằng chứng nào cho thấy anh ta có hoặc muốn có một kho lưu trữ riêng biệt để tuyên bố về chăn của bạn rằng anh ta chỉ nên đẩy đến một kho lưu trữ không trống sẽ không cung cấp cho người hỏi tất cả các tùy chọn; một trong số đó có thể dễ dàng giải quyết vấn đề trước mắt của anh ấy
CB Bailey

10

Bạn có 3 lựa chọn

  1. Kéo và đẩy lại:

    git pull; git push
    
  2. Đẩy vào các nhánh khác nhau:

    git push origin master:foo
    

    và hợp nhất nó trên điều khiển từ xa git yêu cầu hoặc kéo )

    git merge foo
    
  3. Buộc nó (không được đề xuất trừ khi bạn cố tình thay đổi cam kết thông qua rebase):

    git push origin master -f
    

    Nếu vẫn bị từ chối, hãy tắt denyCurrentBranch trên kho lưu trữ từ xa:

    git config receive.denyCurrentBranch ignore
    

Lựa chọn 2 làm việc cho tôi. remote git init local git push origin master: nhánh remote git merge DONE
Jacky Chong

7

Trong thực tế, đặt điều khiển từ xa đến một nhánh không được kiểm tra là đủ. Sau khi bạn kiểm tra từ xa của bạn trong một chi nhánh khác, bạn có thể đẩy.


7

Kiểm tra của bạn .git/configtrong dự án đích:

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[receive]
    denyCurrentBranch = updateInstead

Nếu core. baresai, bạn có thể đặt thành đúng:

$ git config core.bare true

và sau đó trong địa phương của bạn đẩy từ xa:

git push remote_repo   // suppose the destination repo is remote_repo

Nó sẽ thành công, trong remote numpo bạn có thể kiểm tra phiên bản git.

$ git log -1
commit 0623b1b900ef7331b9184722a5381bbdd2d935ba
Author: aircraft < aircraft_xxx@126.com>
Date:   Thu May 17 21:54:37 2018 +0800

và bây giờ bạn không thể sử dụng git trong "không gian làm việc" của mình:

$ git status
fatal: This operation must be run in a work tree

bạn nên đặt bare.barelại thành false.

$ git config core.bare false

5

Tôi gặp vấn đề tương tự khi sử dụng Git để đồng bộ hóa các kho lưu trữ trên điện thoại và máy tính xách tay Android của tôi. Giải pháp cho tôi là thực hiện một cú kéo thay vì đẩy, như @CharlesBailey đề xuất.

git push origin master trên kho lưu trữ Android không thành công đối với tôi với các thông báo lỗi tương tự mà @ hap497 gặp phải do bị đẩy vào kiểm tra không trả tiền của kho lưu trữ + bản sao làm việc.

git pull droid mastertrên kho lưu trữ máy tính xách tay và bản sao làm việc cho tôi. Tất nhiên, trước đây bạn cần phải chạy một cái gì đó như thế nào git remote add droid /media/KINGSTON4GB/notes_repo/.


4

Các phiên bản cũ hơn của Git được sử dụng để cho phép đẩy tới nhánh hiện đang được kiểm tra của kho lưu trữ không trống.

Hóa ra đây là một điều khó hiểu khủng khiếp để cho phép. Vì vậy, họ đã thêm thông điệp cảnh báo mà bạn nhìn thấy, cũng rất khó hiểu.

Nếu kho lưu trữ đầu tiên chỉ hoạt động như một máy chủ thì hãy chuyển đổi nó thành một kho lưu trữ trần như các câu trả lời khác khuyến nghị và được thực hiện với nó.

Tuy nhiên, nếu bạn cần phải có một nhánh chia sẻ giữa hai repos đang sử dụng, bạn có thể đạt được nó với thiết lập sau

Repo1 - sẽ đóng vai trò là máy chủ và cũng được sử dụng để phát triển

Repo2 - sẽ chỉ dành cho phát triển

Thiết lập Repo1 như sau

Tạo một chi nhánh để chia sẻ công việc trên.

git branch shared_branch

Để an toàn, bạn cũng nên tạo một $ (REPO) .git / hook / update từ chối mọi thay đổi đối với bất kỳ điều gì khác ngoài shared_branch, vì bạn không muốn mọi người làm phiền với các chi nhánh riêng của bạn.

repo1/.git/hooks  (GIT_DIR!)$ cat update
#!/bin/sh
refname="$1"
oldrev="$2"
newrev="$3"

if [ "${refname}" != "refs/heads/shared_branch" ]
then
   echo "You can only push changes to shared_branch, you cannot push to ${refname}"
   exit 1
fi

Bây giờ tạo một chi nhánh địa phương trong repo1 nơi bạn sẽ thực hiện công việc thực tế của mình.

git checkout -b my_work --track shared_branch
Branch my_work set up to track local branch shared_branch.
Switched to a new branch 'my_work'

(có thể cần phải git config --global push.default upstreamtheo thứ tự cho git pushđến nơi làm việc)

Bây giờ bạn có thể tạo repo2 với

git clone path/to/repo1 repo2 
git checkout shared_branch 

Tại thời điểm này, bạn có cả thiết lập repo1 và repo2 để hoạt động trên các nhánh cục bộ đẩy và kéo từ shared_branchtrong repo1, mà không cần phải lo lắng về thông báo lỗi đó hoặc thư mục làm việc không đồng bộ trong repo1. Bất cứ quy trình công việc bình thường bạn sử dụng nên làm việc.


3

OK, trong trường hợp bạn muốn có một kho lưu trữ từ xa bình thường, sau đó tạo một nhánh phụ và kiểm tra nó. Đẩy nó vào một nhánh (không được kiểm tra) và hợp nhất nó với một nhánh hiện đang hoạt động sau khi đẩy từ cục bộ.

Ví dụ: trên một máy chủ từ xa:

git branch dev
git checkout dev

Trên thiết lập cục bộ:

git push 

Trên máy chủ từ xa:

git merge dev

2

Đây là một thử nghiệm bạn có thể làm để xem cách thức hoạt động của baremáy chủ:

Hãy tưởng tượng bạn có một máy trạm và một máy chủ có trang web trực tiếp được lưu trữ trên đó và thỉnh thoảng bạn muốn cập nhật trang web này (điều này cũng áp dụng cho tình huống hai nhà phát triển gửi công việc qua lại thông qua một người trung gian trần).

Khởi tạo

Tạo một số thư mục trên máy tính cục bộ của bạn và cdvào đó, sau đó thực hiện các lệnh sau:

# initialization
git init --bare server/.git
git clone server content
git clone server local
  1. Đầu tiên bạn tạo một serverthư mục trống (chú ý .git ở cuối). Thư mục này sẽ chỉ phục vụ như một thùng chứa cho các tệp lưu trữ của bạn.
  2. Sau đó sao chép kho lưu trữ máy chủ của bạn vào một contentthư mục mới được tạo . Đây là thư mục trực tiếp / sản xuất của bạn sẽ được phục vụ bởi phần mềm máy chủ của bạn.
  3. Hai thư mục đầu tiên nằm trên máy chủ của bạn, thư mục thứ ba là một thư mục cục bộ trên máy trạm của bạn.

Quy trình làm việc

Bây giờ đây là quy trình làm việc cơ bản:

  1. Nhập localthư mục, tạo một số tệp và cam kết chúng. Cuối cùng đẩy chúng đến máy chủ:

    # create crazy stuff
    git commit -av
    git push origin master
    
  2. Bây giờ hãy nhập contentthư mục và cập nhật nội dung của máy chủ:

    git pull
    
  3. Lặp lại 1-2. Ở đây contentcó thể là một nhà phát triển khác cũng có thể đẩy đến máy chủ và localnhư bạn có thể rút từ anh ta.


2

Sử dụng điều này để đẩy nó đến chi nhánh thượng nguồn từ xa đã giải quyết vấn đề này cho tôi:

git push <remote> master:origin/master

Điều khiển từ xa không có quyền truy cập vào repo ngược dòng vì vậy đây là một cách tốt để có được những thay đổi mới nhất vào điều khiển từ xa đó


1
Tổng quát hơn (vì đây là hiệu ứng ròng của lệnh), sử dụng git push <remote> master:newbranch. Ý tưởng là bạn đẩy một nhánh mới vào điều khiển từ xa, sau đó có thể được hợp nhất. Cách này giúp bạn tránh mọi vấn đề không nhất quán được đề cập trong thông báo lỗi.
Clay

1

Tôi đã phải chạy lại git --inittrong một kho lưu trữ trống hiện có và điều này đã tạo ra một .gitthư mục bên trong cây kho lưu trữ trần - tôi nhận ra rằng sau khi gõ vào git statusđó. Tôi đã xóa nó và mọi thứ đã ổn trở lại :)

(Tất cả những câu trả lời này đều tuyệt vời, nhưng trong trường hợp của tôi, nó là một thứ hoàn toàn khác (theo như tôi có thể thấy), như được mô tả.)


1

Tôi chắc rằng hầu hết mọi người xem câu hỏi này sẽ dừng lại ở hai câu trả lời lớn đầu tiên, nhưng tôi vẫn muốn đưa ra giải pháp của mình.

Tôi đã có một thiết lập dự án web Eclipse + EGit khi gặp lỗi được mô tả. Điều giúp tôi chỉ đơn giản là sử dụng ứng dụng GitHub, có vẻ như giải quyết vấn đề một cách kỳ diệu. Trong khi EGit luôn từ chối việc đẩy, ứng dụng máy tính để bàn GitHub sẽ chỉ nhún vai và đẩy những thay đổi của tôi. Có lẽ nó xử lý tình huống đa đăng nhập một cách duyên dáng hơn.


1

Một bài viết tôi thấy có thể hữu ích cho người khác là Git trong 5 phút .

Tôi đã có một dự án Xcode dưới sự kiểm soát phiên bản Git mà tôi muốn đẩy lên Ethernet phân tán ảo (VDE) mà tôi có trong một DC. VDE chạy Centos 5.

Không có bài báo nào tôi đọc về Git nói về kho lưu trữ trần. Tất cả nghe có vẻ đơn giản cho đến khi tôi thử những gì tôi nghĩ nên dễ dàng đến từ nền SVN .

Các đề xuất ở đây để làm cho kho lưu trữ từ xa trần hoạt động. Thậm chí tốt hơn cho các yêu cầu của tôi là sao chép dự án Xcode sang projectname.git, sao chép nó vào máy chủ từ xa; sau đó đẩy làm việc kỳ diệu. Bước tiếp theo sẽ khiến Xcode được đẩy mà không có lỗi về các cam kết, nhưng hiện tại tôi vẫn ổn khi thực hiện nó từ Terminal.

Vì thế:

cd /tmp (or another other directory on your system)<br/>
git clone --bare /xcode-project-directory projectname.git<br/>
scp -r projectname.git sshusername@remotehost.com:repos/<br/>

Để đẩy các thay đổi từ dự án Xcode của bạn sau khi bạn đã cam kết trong Xcode:

cd /xcode-project-directory<br/>
git push sshusername@remotehost.com:repos/projectname.git<br/>

Tôi chắc chắn có một cách dễ dàng hơn tinh vi hơn để làm ở trên, nhưng ở mức tối thiểu này hoạt động. Để mọi thứ rõ ràng, đây là một số giải thích: /xcode-project-directorythư mục dự án xcode của bạn được lưu trữ. Có lẽ/Users/Your_Name/Documents/Project_Name . projectname đúng nghĩa là tên của dự án, nhưng nó có thể là bất cứ điều gì bạn quan tâm để gọi nó. Git không quan tâm, bạn sẽ.

Để sử dụng scp, bạn cần có tài khoản người dùng trên máy chủ từ xa cho phép truy cập SSH . Bất cứ ai chạy máy chủ của riêng họ sẽ có điều này. Nếu bạn đang sử dụng lưu trữ được chia sẻ hoặc tương tự, bạn có thể không gặp may.

remotehost.comlà tên của máy chủ từ xa của bạn. Bạn có thể dễ dàng sử dụng địa chỉ IP của nó. Để rõ hơn, tôi đang sử dụng Gitosis trên máy chủ từ xa bằng các khóa SSH, vì vậy tôi không được nhắc nhập mật khẩu khi tôi ấn. Bài viết Lưu trữ kho Git, Cách dễ dàng (và an toàn) cho bạn biết cách thiết lập tất cả.


1

Cách tốt nhất để làm điều này là:

mkdir ..../remote
cd ..../remote
git clone --bare .../currentrepo/

Điều này sẽ sao chép kho lưu trữ, nhưng nó sẽ không tạo ra bất kỳ bản sao làm việc nào .../remote. Nếu bạn nhìn vào điều khiển từ xa, bạn sẽ thấy một thư mục được tạo, được gọi currentrepo.git, đó có thể là những gì bạn muốn.

Sau đó, từ kho Git cục bộ của bạn:

git remote add remoterepo ..../remote/currentrepo.git

Sau khi bạn thay đổi, bạn có thể:

git push remoterepo master

1

Tôi vừa gặp vấn đề này với kho lưu trữ git triển khai trên Heroku .

Tôi không biết tại sao Heroku có một kho lưu trữ không trống ở bên cạnh họ, nhưng như một cách giải quyết, tôi đã có thể đặt lại kho lưu trữ từ xa và tải lại.

Bạn không nên sử dụng bản sao kho lưu trữ của Heroku làm kho lưu trữ git duy nhất của mình để cộng tác, nhưng chỉ trong trường hợp, tôi sẽ nói rõ: Đừng làm điều này trừ khi bạn chắc chắn rằng bạn có một bản sao đầy đủ của kho được lưu trữ an toàn ở đâu đó ngoài Heroku. Thực hiện thiết lập lại sẽ xóa nội dung kho lưu trữ.

Để thiết lập lại:

  1. Cài đặt công cụ Heroku (chứa ứng dụng khách dòng lệnh) nếu bạn chưa có.
  2. Cài đặt plugin heroku-repo nếu bạn chưa có.

    heroku plugins:install https://github.com/heroku/heroku-repo.git
    
  3. Thực hiện thiết lập lại, trong đó xóa kho lưu trữ và tạo một kho mới, trống

    heroku repo:reset
    
  4. Đẩy đến Heroku của bạn từ xa như bình thường; nó sẽ tải lại tất cả mọi thứ.


Bạn có thể cần phải cài đặt các công cụ repo Heroku để làm việc này. Làmheroku plugins:install https://github.com/heroku/heroku-repo.git

1

Bạn sẽ cần thay đổi tệp cấu hình trên máy chủ từ xa khi bạn đã tạo kho lưu trữ trống (trống)

root@development:/home/git/repository/my-project# cat config 

ở đó bạn sẽ thấy

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true

Bạn sẽ biến điều này thành sai thành đúng và tôi đã xóa logallrefupdates = true (không chắc chắn về việc sử dụng nó!)

đến

[core]
repositoryformatversion = 0
filemode = true
bare = true

Bạn có thể kiểm tra sau

$ git remote show origin
* remote origin
Fetch URL: my-portal@development:/home/XYZ/repository/XYZ
Push  URL: my-portal@development:/home/XYZ/repository/XYZ
HEAD branch: (unknown)

Nhánh CHÍNH này: (không xác định) sẽ được hiển thị nếu bạn không thể PUSH. Vì vậy, nếu nhánh CHÍNH không được biết, bạn nên thay đổi thành đúng và sau khi đẩy thành công, bạn có thể sử dụng lại

git remote show origin

và bạn sẽ thấy

 HEAD branch: master

0

Đối với tôi giải pháp làm việc là:

TRÊN TỪ XA:

git checkout -b some_tmp_name

TRÊN ĐỊA PHƯƠNG:

git push

TRÊN TỪ XA:

git checkout master
git branch -d some_tmp_name

Nhưng đây không phải là giải pháp thực sự, nó chỉ là cách giải quyết.


Đây là một giải pháp hợp lệ nếu bạn không có một kho lưu trữ trung tâm.
Rick

0

Chỉ trong trường hợp ai đó thấy nó hữu ích. Đối với tôi đó là một vấn đề quyền máy chủ git. Tôi đã kiểm tra dự án từ việc năn nỉ và đẩy một tập tin đơn giản và sau đó tôi nhận được "Đẩy bị từ chối: Đẩy đến nguồn gốc / chủ bị từ chối"


-1

Với Git, hai kho lưu trữ thông thường (không trống) không thể đẩy / kéo tệp trực tiếp qua lại. Phải có một kho lưu trữ trung gian. Rõ ràng, nó giống như một cặp vợ chồng có một đứa con và cặp vợ chồng sắp ly hôn. Bố mẹ sẽ không nói chuyện với nhau, nhưng họ sẽ giao tiếp với nhau.

Vì vậy, bạn có một kho lưu trữ, bạn sao chép kho lưu trữ này vào một kho lưu trữ trống, và sau đó bạn sao chép nó sang một kho lưu trữ thứ ba. Cái đầu tiên và thứ ba có thể trao đổi thông tin thông qua kho lưu trữ thứ hai, kho lưu trữ trần. Tôi đoán điều này có ý nghĩa, vì bạn sẽ không muốn ai đó có thể kiểm tra nội dung vào kho lưu trữ của mình mà không có sự đồng ý của bạn, vì điều đó có thể gây ra xung đột hợp nhất và tương tự.

Vì vậy, đây là một ví dụ:

Trên PC, trong ~ / không gian làm việc

git init
echo "line 1" > afile.txt
git add .
git commit -m ‘initial import’
git clone --bare . ../remote-repository.git
git remote add origin ../remote-repository.git
git push --set-upstream origin master

Trên máy tính xách tay, trong ~ / không gian làm việc (không làm git init, v.v.)

git clone //LJZ-DELLPC/remote-repository.git/ .

// Sau đó thực hiện các cam kết khác nhau và đẩy chúng:

echo "line 2" > afile.txt
git add afile.txt
git commit -m 'added line 2'
git push    

Sau đó quay lại PC, trong ~ / không gian làm việc

git pull

// Sau đó thực hiện các cam kết khác nhau và đẩy chúng:

git push

Trên máy tính xách tay git kéo

và kể từ đó trở đi..

Đây là một ví dụ cụ thể tuyệt đối tất cả trên một máy, được sao chép trực tiếp từ cửa sổ lệnh, để chúng ta biết rằng không có bước nào bị bỏ qua, rằng nó thực sự đã hoạt động, v.v .:

lylez@LJZ-DELLPC ~
$ cd gitdir
/home/lylez/gitdir

lylez@LJZ-DELLPC ~/gitdir
$ ls

lylez@LJZ-DELLPC ~/gitdir
$ mkdir repo1

lylez@LJZ-DELLPC ~/gitdir
$ cd repo1
/home/lylez/gitdir/repo1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git init
Initialized empty Git repository in /home/lylez/gitdir/repo1/.git/

lylez@LJZ-DELLPC ~/gitdir/repo1
$ echo "line 1" > afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git commit -m 'initial import'
[master (root-commit) f407e12] initial import
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git clone --bar . ../repo1-bare-clone
Cloning into bare repository '../repo1-bare-clone'...
done.

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git remote add origin ../repo1-bare-clone

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git push --set-upstream origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cd ..

lylez@LJZ-DELLPC ~/gitdir
$ ls
repo1  repo1-bare-clone

lylez@LJZ-DELLPC ~/gitdir
$ mkdir repo1-remote

lylez@LJZ-DELLPC ~/gitdir
$ cd repo1-remote
/home/lylez/gitdir/repo1-remote

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git clone ../repo1-bare-clone .
Cloning into '.'...
done.

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ echo "line 2" >> afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git commit -m 'added line 2'
[master 5ad31e0] added line 2
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 260 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/lylez/gitdir/repo1-remote/../repo1-bare-clone
   f407e12..5ad31e0  master -> master

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cd ../repo1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cat afile.txt
line 1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../repo1-bare-clone
   f407e12..5ad31e0  master     -> origin/master
Updating f407e12..5ad31e0
Fast-forward
 afile.txt | 1 +
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cat afile.txt
line 1
line 2

lylez@LJZ-DELLPC ~/gitdir/repo1
$ echo "line 3" >> afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git commit -m 'added line 3'
[master 3fa569e] added line 3
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 265 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../repo1-bare-clone
   5ad31e0..3fa569e  master -> master

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cd ../repo1-remote/

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1
line 2

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/lylez/gitdir/repo1-remote/../repo1-bare-clone
   5ad31e0..3fa569e  master     -> origin/master
Updating 5ad31e0..3fa569e
Fast-forward
 afile.txt | 1 +
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1
line 2
line 3

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git --version
git version 2.1.1

lylez@LJZ-DELLPC ~/gitdir/repo1-remote

Đó là một ví dụ về những gì hoạt động, và một lời giải thích tại sao. Không có thông tin sai ở đây, ngoại trừ nhận xét của bạn.
Lyle Z

1
"Với Git, hai kho lưu trữ thông thường (không trống) không thể đẩy / kéo tệp trực tiếp qua lại" - Ngoại trừ việc chúng có thể.
Andrew C

Tốt, đăng một ví dụ cụ thể thay vì một cuộc tấn công.
Lyle Z

Hoặc bạn có thể google nó? stackoverflow.com/questions/1764380/ cấp
Andrew C

Phản hồi đầu tiên trong chuỗi mà trang web của bạn bắt đầu bằng "... nhưng theo git ready và git wiki chính thức, bạn chỉ nên đẩy đến một repo trần.". Câu trả lời tiếp theo, "Nếu bạn muốn thử chỉ cần đẩy master -> master, thì lệnh chỉ là: git push origin", và điều đó đơn giản là không hoạt động, và có hàng trăm bài đăng ảnh hưởng đến điều đó. Câu trả lời cuối cùng bắt đầu bằng "Tôi muốn đề xuất 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.", Đó chính xác là những gì tôi đề xuất.
Lyle Z

-3

Giải pháp của tôi (đang sử dụng)

  1. Thanh toán "chính chủ" trên máy chủ từ xa
  2. Làm việc tại địa phương trên chi nhánh "dev"
  3. Đẩy các thay đổi vào dev từ xa
  4. Hợp nhất dev thành chủ trên remote

chơi lô tô

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.