Mengapa saya tidak bisa mendorong ke repositori telanjang ini?

283

Bisakah Anda menjelaskan apa yang salah dengan alur kerja ini?

$ 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'

Tidak git pushselalu mendorong ke repositori tempat saya dikloning?

ripper234
sumber
Tidakkah Anda harus menentukan cabang untuk mendorong?
Rekin
3
tidak setelah klon !!! setelah masalah diperbaiki, ini berfungsi dengan baik dan tidak perlu menentukan cabang ... hanya pada checkout pertama dari repositori kosong apakah ini terjadi yang SANGAT SANGAT menyebalkan ... mereka harus memperbaiki masalah ini.
Dean Hiller
Semoga posting ini bermanfaat bagi seseorang ketika mencoba melakukan di atas- samranga.blogspot.com/2015/07/... Kesalahan dalam pertanyaan dapat muncul bahkan ketika mencoba membuat repositori BitBucket git dari proyek yang sudah ada secara lokal
Samitha Chathuranga

Jawaban:

483

Ya, masalahnya adalah tidak ada komitmen dalam "bare". Ini adalah masalah dengan komit pertama saja, jika Anda membuat repo dalam urutan (bare, alice). Coba lakukan:

git push --set-upstream origin master

Ini hanya diperlukan pertama kali. Setelah itu harus berfungsi normal.

Seperti yang ditunjukkan Chris Johnsen, Anda tidak akan mengalami masalah ini jika push.default Anda disesuaikan. Saya suka upstream / pelacakan.

Seth Robertson
sumber
1
Saya lakukan sudo apt-get upgrade git-coredan sudo apt-get upgrade gitdan menurut saya tidak diperlukan pembaruan. git --versionmengembalikan 1.7.3.1. Ada yang tahu apa yang hilang? Saya akui saat apt-get updateini tidak bekerja untuk saya, tetapi itu tidak terlalu lama.
ripper234
1
@ ripper234: Versi git saat ini adalah 1.7.5.3 Anda dapat hidup dengan ketidaknyamanan, menggunakan alur kerja yang berbeda, atau menginstal git terbaru secara manual tanpa kemasan debian / ubuntu.
Seth Robertson
Ah benar, saya lupa bahwa perangkat lunak perlu waktu sebelum dikemas. Saya seorang noob linux, berasal dari Windows, dan digunakan untuk mengklik di sini untuk menginstal-versi-terbaru.
ripper234
9
Mengenai “Versi terbaru tidak memiliki masalah ini”: Bahkan dalam versi terbaru, standar untuk dorongan tampaknya tidak berubah dari matching; mungkin Anda telah push.defaultmenetapkan ke upstream/ tracking(atau current) di Anda ~/.gitconfig?
Chris Johnsen
4
Cobalah git push origin master:masteruntuk membuatnya eksplisit. Jika itu tidak berhasil, periksa untuk melihat di cabang mana Anda berada: git branchmungkin Anda belum membuat komit pertama atau Anda membuat komit pada cabang selain master.
Seth Robertson
43

Jika kamu:

 git push origin master

itu akan mendorong ke repo telanjang.

Sepertinya repo alice Anda tidak melacak dengan benar.

cat .git/config

Ini akan menampilkan remote dan cabang default.

Jika kamu

 git push -u origin master

Anda harus mulai melacak remote dan cabang itu. Saya tidak yakin apakah opsi itu selalu di git.

serby
sumber
30

Jawaban pertanyaan terkait ini memberikan solusi bagi saya ... itu hanya kesalahan bodoh:

Ingat untuk berkomitmen dulu!

https://stackoverflow.com/a/7572252

Jika Anda belum berkomitmen pada repo lokal Anda, tidak ada yang mendorong, tetapi pesan galat Git yang Anda dapatkan kembali tidak banyak membantu Anda.

phpguru
sumber
17
git push --all

adalah cara kanonik untuk mendorong semuanya ke repositori telanjang baru.

Cara lain untuk melakukan hal yang sama adalah membuat repositori baru Anda yang non-telanjang dan kemudian membuat klon kosong dengan

git clone --bare

lalu gunakan

git remote add origin <new-remote-repo>

dalam repositori asli (non-telanjang).

ebneter
sumber
... jadi Anda menurunkan jawabannya? Ini adalah cara standar untuk mendorong semuanya ke repositori baru yang telanjang. Jika tidak berhasil untuk Anda, ada beberapa masalah lain.
ebneter
Anda benar, saya mungkin tidak seharusnya, saya tahu Anda hanya berusaha membantu. Jika Anda mengeditnya, saya akan membatalkan downvote saya.
ripper234
Terima kasih, sunting dengan cara lain untuk menyelesaikan tugas yang sama.
ebneter
Jawaban Anda membantu saya berterima kasih;) Tetapi pada akhir perintah, jalan harus ada seperti ini: git push --all ../test_repoURL repo di akhir perintah;)
Metafaniel
@ Metafaniel Itu tergantung pada bagaimana Anda mengaturnya. Jika repo lokal Anda sudah memiliki kendali jarak jauh yang dikonfigurasi dengan benar, "git push --all" akan berfungsi sebagaimana mestinya.
ebneter
7

Coba ini di alicerepositori Anda (sebelum mendorong):

git config push.default tracking

Atau, konfigurasikan sebagai default untuk pengguna Anda git config --global ….


git pushmemang default untuk originrepositori (yang biasanya repositori dari mana Anda mengkloning repositori saat ini), tapi itu tidak default untuk mendorong cabang saat ini — itu default untuk mendorong hanya cabang yang ada di repositori sumber dan repositori tujuan.

The push.defaultvariabel konfigurasi (lihat git-config (1) ) kontrol apa git pushakan mendorong bila tidak diberi “refspec” argumen (yaitu sesuatu setelah nama repositori). Nilai default memberikan perilaku yang dijelaskan di atas.

Berikut adalah nilai yang mungkin untuk push.default:

  • nothing
    Ini memaksa Anda untuk memasok "refspec".

  • matching(default)
    Ini mendorong semua cabang yang ada di repositori sumber dan repositori tujuan.
    Ini sepenuhnya independen dari cabang yang saat ini sedang diperiksa.

  • upstreamatau tracking
    (Kedua nilai berarti hal yang sama. Yang kemudian tidak digunakan lagi untuk menghindari kebingungan dengan cabang "pelacakan jarak jauh". Yang pertama diperkenalkan pada 1.7.4.2, jadi Anda harus menggunakan yang terakhir jika Anda menggunakan Git 1.7.3.1. )
    Ini mendorong cabang saat ini ke cabang yang ditentukan oleh konfigurasi "hulu".

  • current
    Ini mendorong cabang saat ini ke cabang dengan nama yang sama di repositori tujuan.

    Dua yang terakhir ini berakhir menjadi sama untuk kasus-kasus umum (misalnya bekerja pada master lokal yang menggunakan asal / master sebagai hulu), tetapi mereka berbeda ketika cabang lokal memiliki nama yang berbeda dari cabang "hulu":

    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
    

    Dengan push.defaultsama dengan upstream(atau tracking), push akan pergi ke origin's induk cabang. Ketika itu sama dengan current, push akan pergi ke origin's quickfix cabang.

The matchingPengaturan akan memperbarui bare's Master dalam skenario Anda setelah telah ditetapkan. Untuk membangunnya, Anda bisa menggunakannya git push origin mastersekali.

Namun, upstreampengaturannya (atau mungkin current) sepertinya lebih cocok untuk apa yang Anda harapkan akan terjadi, jadi Anda mungkin ingin mencobanya:

# 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

(Sekali lagi, jika Anda masih menggunakan Git sebelum 1.7.4.2, Anda harus menggunakan trackingbukan upstream).

Chris Johnsen
sumber
1

Saya menggunakan klien SourceTree git, dan saya melihat bahwa perintah commit / push awal mereka adalah:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
IgorGanapolsky
sumber