Tại sao tôi không thể đẩy vào kho lưu trữ trần này?


283

Bạn có thể giải thích những gì là sai với quy trình công việc này?

$ git init --bare bare
Initialized empty Git repository in /work/fun/git_experiments/bare/
$ git clone bare alice
Cloning into alice...
done.
warning: You appear to have cloned an empty repository.
$ cd alice/
$ touch a
$ git add a
$ git commit -m "Added a"
[master (root-commit) 70d52d4] Added a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '/work/fun/git_experiments/bare'

Không phải git pushlúc nào cũng đẩy đến kho lưu trữ mà tôi đã nhân bản?


Bạn không nên chỉ định chi nhánh để đẩy?
Rekin

3
không phải sau một bản sao !!! sau khi sự cố được khắc phục, nó hoạt động rất tốt và không cần chỉ định chi nhánh ... chỉ trong lần kiểm tra đầu tiên của kho lưu trữ trống, điều này xảy ra rất khó chịu ... họ nên khắc phục vấn đề này.
Dean Hiller

Hy vọng bài đăng này sẽ hữu ích cho ai đó khi cố gắng thực hiện ở trên- samranga.blogspot.com/2015/07/, Lỗi trong câu hỏi có thể được bật ngay cả khi cố gắng tạo kho lưu trữ BitBucket từ một dự án đã có sẵn tại địa phương
Samitha Chathuranga

Câu trả lời:


483

Vâng, vấn đề là không có cam kết trong "trần". Đây chỉ là vấn đề với cam kết đầu tiên, nếu bạn tạo các repos theo thứ tự (trần, alice). Hãy thử làm:

git push --set-upstream origin master

Điều này sẽ chỉ được yêu cầu lần đầu tiên. Sau đó nó sẽ hoạt động bình thường.

Như Chris Johnsen đã chỉ ra, bạn sẽ không gặp phải vấn đề này nếu Push.default của bạn được tùy chỉnh. Tôi thích ngược dòng / theo dõi.


1
Tôi đang làm sudo apt-get upgrade git-coresudo apt-get upgrade gitnó nghĩ rằng không cần cập nhật. git --versiontrả về 1.7.3.1. Bất cứ ý tưởng những gì còn thiếu? Tôi thừa nhận hiện tại apt-get updatekhông làm việc cho tôi, nhưng nó đã không quá lâu.
ripper234

1
@ ripper234: Phiên bản hiện tại của git là 1.7.5.3 Bạn có thể sống với sự bất tiện, sử dụng quy trình làm việc khác hoặc cài đặt gói git mới nhất theo cách thủ công w / o debian / ub Ubuntu.
Seth Robertson

À đúng rồi, tôi quên rằng phần mềm phải mất một thời gian trước khi nó được đóng gói. Tôi là một noob linux, đến từ Windows và được sử dụng để bấm vào đây để cài đặt phiên bản mới nhất.
ripper234

9
Về phiên bản gần đây không có vấn đề này, ngay cả trong các phiên bản gần đây, mặc định cho các lần đẩy dường như không thay đổi từ matching; có lẽ bạn đã push.defaultđặt thành upstream/ tracking(hoặc current) trong của bạn ~/.gitconfig?
Chris Johnsen

4
Cố gắng git push origin master:masterlàm cho nó rõ ràng. Nếu điều đó không hiệu quả, hãy kiểm tra xem bạn đang ở chi nhánh nào: git branchcó lẽ bạn chưa thực hiện cam kết đầu tiên hoặc bạn đã thực hiện cam kết đó trên một chi nhánh khác ngoài chủ.
Seth Robertson

43

Nếu bạn:

 git push origin master

nó sẽ đẩy đến repo trần.

Có vẻ như repo alice của bạn không theo dõi chính xác.

cat .git/config

Điều này sẽ hiển thị từ xa và chi nhánh mặc định.

nếu bạn

 git push -u origin master

Bạn nên bắt đầu theo dõi từ xa và chi nhánh. Tôi không chắc nếu tùy chọn đó luôn ở trong git.


30

Câu trả lời của câu hỏi liên quan này đã cung cấp giải pháp cho tôi ... đó chỉ là một sai lầm ngớ ngẩn:

Hãy nhớ cam kết trước!

https://stackoverflow.com/a/7572252

Nếu bạn chưa cam kết với repo cục bộ của mình, không có gì để đẩy, nhưng thông báo lỗi Git mà bạn nhận lại không giúp bạn quá nhiều.


17
git push --all

là cách kinh điển để đẩy mọi thứ sang một kho lưu trữ mới.

Một cách khác để làm điều tương tự là tạo kho lưu trữ mới, không trống của bạn và sau đó tạo một bản sao trần với

git clone --bare

sau đó sử dụng

git remote add origin <new-remote-repo>

trong kho lưu trữ ban đầu (không trần).


... Vì vậy, bạn đánh giá thấp câu trả lời? Đó cách tiêu chuẩn để đẩy mọi thứ sang một kho lưu trữ mới, trần trụi. Nếu nó không làm việc cho bạn, có một số vấn đề khác.
ebneter

Bạn nói đúng, tôi có lẽ không nên có, tôi biết bạn chỉ đang cố gắng giúp đỡ. Nếu bạn chỉnh sửa nó, tôi sẽ hoàn tác downvote của tôi.
ripper234

Cảm ơn, chỉnh sửa nó với một cách khác để hoàn thành nhiệm vụ tương tự.
ebneter

Câu trả lời của bạn đã giúp tôi cảm ơn;) Nhưng khi kết thúc lệnh, đường dẫn phải có mặt như thế này: git push --all ../test_repoURL của repo ở cuối lệnh;)
Metafaniel

@Metafaniel Điều đó phụ thuộc vào cách bạn thiết lập nó. Nếu repo cục bộ của bạn đã có từ xa được cấu hình đúng cách, "git đẩy --all" sẽ hoạt động như bình thường.
ebneter

7

Hãy thử điều này trong alicekho lưu trữ của bạn (trước khi đẩy):

git config push.default tracking

Hoặc, cấu hình nó làm mặc định cho người dùng của bạn với git config --global ….


git pushkhông mặc định cho originkho lưu trữ (thường là kho lưu trữ mà bạn đã sao chép kho lưu trữ hiện tại), nhưng nó không mặc định để đẩy nhánh hiện tại, nó mặc định chỉ đẩy các nhánh tồn tại trong cả kho lưu trữ nguồn và kho lưu trữ đích.

Biến push.defaultcấu hình (xem git-config (1) ) kiểm soát những gì git pushsẽ đẩy khi nó không được cung cấp bất kỳ đối số giới thiệu nào của giới thiệu (tức là một cái gì đó sau tên kho lưu trữ). Giá trị mặc định cho hành vi được mô tả ở trên.

Dưới đây là các giá trị có thể cho push.default:

  • nothing
    Điều này buộc bạn phải cung cấp một refspec khác.

  • matching(mặc định)
    Điều này đẩy tất cả các nhánh tồn tại trong cả kho lưu trữ nguồn và kho lưu trữ đích.
    Điều này là hoàn toàn độc lập với các chi nhánh hiện đang được kiểm tra.

  • upstreamhoặc tracking
    (Cả hai giá trị đều có nghĩa giống nhau. Cái sau không được dùng để tránh nhầm lẫn với các chi nhánh của bộ theo dõi từ xa. Cái trước được giới thiệu trong 1.7.4.2, vì vậy bạn sẽ phải sử dụng cái sau nếu bạn đang sử dụng Git 1.7.3.1. )
    Những cái này đẩy nhánh hiện tại đến nhánh được chỉ định bởi cấu hình dòng ngược dòng của nó.

  • current
    Điều này đẩy nhánh hiện tại đến nhánh cùng tên tại kho đích.

    Hai trường hợp cuối cùng này giống nhau cho các trường hợp phổ biến (ví dụ: làm việc trên master master sử dụng nguồn gốc / master làm ngược dòng), nhưng chúng khác nhau khi nhánh cục bộ có một tên khác với nhánh nhánh ngược dòng của nó:

    git checkout master
    # hack, commit, hack, commit
    
    # bug report comes in, we want a fix on master without the above commits
    
    git checkout -b quickfix origin/master  # "upstream" is master on origin
    # fix, commit
    git push
    

    Với push.defaultbằng upstream(hoặc tracking), push sẽ đi đến origin's chủ chi nhánh. Khi nó bằng current, đẩy sẽ đi đến origin's QuickFix chi nhánh.

Các matchingthiết lập sẽ cập nhật barecủa bậc thầy trong kịch bản của bạn một khi nó đã được thiết lập. Để thiết lập nó, bạn có thể sử dụng git push origin mastermột lần.

Tuy nhiên, upstreamcài đặt (hoặc có thể current) có vẻ như phù hợp hơn với những gì bạn mong đợi sẽ xảy ra, vì vậy bạn có thể muốn thử:

# try it once (in Git 1.7.2 and later)
git -c push.default=upstream push

# configure it for only this repository
git config push.default upstream

# configure it for all repositories that do not override it themselves
git config --global push.default upstream

(Một lần nữa, nếu bạn vẫn đang sử dụng Git trước 1.7.4.2, bạn sẽ cần sử dụng trackingthay vì upstream).


1

Tôi sử dụng máy khách SourceTree git và tôi thấy rằng lệnh commit / push ban đầu của họ là:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
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.