Saya telah menyelesaikan beberapa konflik gabungan, berkomitmen kemudian mencoba untuk mendorong perubahan saya dan menerima kesalahan berikut:
c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'
Adakah yang tahu apa yang menyebabkan kesalahan ini?
git config receive.denyCurrentBranch=updateInstead
: stackoverflow.com/a/28262104/6309Jawaban:
Alasan: Anda mendorong ke Repositori Non-Telanjang
Ada dua jenis repositori: telanjang dan non-telanjang
Repositori kosong tidak memiliki salinan yang berfungsi dan Anda dapat mendorongnya. Itulah jenis-jenis repositori yang Anda dapatkan di Github! Jika Anda ingin membuat repositori kosong, Anda dapat menggunakan
Jadi, singkatnya, Anda tidak bisa mendorong ke repositori non-telanjang(Sunting: Ya, Anda tidak dapat mendorong ke cabang repositori yang saat ini diperiksa. Dengan repositori telanjang, Anda dapat mendorong ke cabang mana pun karena tidak ada yang diperiksa. Meskipun mungkin, mendorong ke repositori non-telanjang tidak umum) . Apa yang dapat Anda lakukan, adalah mengambil dan menggabungkan dari repositori lainnya. Inilahpull request
yang bisa Anda lihat di Github. Anda meminta mereka untuk menarik dari Anda, dan Anda tidak memaksa mereka.Pembaruan : Terima kasih kepada VonC karena menunjukkan ini, dalam versi git terbaru (saat ini 2.3.0), mendorong ke cabang yang dicek dari repositori non-telanjang dimungkinkan . Meskipun demikian, Anda masih tidak dapat mendorong ke a pohon kerja yang kotor , yang sebenarnya bukan operasi yang aman.
sumber
git config receive.denyCurrentBranch=updateInstead
: stackoverflow.com/a/28262104/6309Saya memecahkan masalah ini dengan terlebih dahulu memverifikasi bahwa remote tidak memiliki apa pun diperiksa (itu benar-benar tidak seharusnya), dan kemudian membuatnya kosong dengan:
Setelah itu git push bekerja dengan baik.
sumber
git config core.bare false
dangit reset --hard
?Ringkasan
Anda tidak dapat mendorong ke cabang repositori yang sudah diperiksa karena itu akan mengacaukan dengan pengguna repositori tersebut dengan cara yang kemungkinan besar akan berakhir dengan hilangnya data dan riwayat . Tetapi Anda bisa mendorong ke cabang lain dari repositori yang sama.
Karena repositori telanjang tidak pernah memiliki cabang yang diperiksa, Anda selalu dapat mendorong ke cabang repositori telanjang mana pun.
Otopsi masalah
Ketika cabang dicentang, komit akan menambahkan komit baru dengan kepala cabang saat ini sebagai induknya dan memindahkan kepala cabang menjadi komit baru itu.
Begitu
menjadi
Tetapi jika seseorang bisa mendorong ke peralihan cabang itu, pengguna akan mendapatkan dirinya sendiri dalam apa yang disebut git mode head terpisah :
Sekarang pengguna tidak lagi di branch1, tanpa secara eksplisit diminta untuk memeriksa cabang lain. Lebih buruk lagi, pengguna sekarang berada di luar cabang apa pun , dan komit baru apa pun hanya akan menjuntai :
Hipotetis, jika pada titik ini, pengguna memeriksa cabang lain, maka komit menggantung ini menjadi permainan yang adil bagi pengumpul sampah Git .
sumber
cd ke direktori repo / yang Anda tekan pada mesin remote dan masuk
sumber
Bagi saya, berikut ini caranya:
git config --global receive.denyCurrentBranch updateInstead
Saya mengatur drive F :, hampir secara keseluruhan, untuk menyinkronkan antara desktop Windows 10 dan laptop Windows 10 saya, menggunakan Git. Saya akhirnya menjalankan perintah di atas pada kedua mesin.
Pertama saya membagikan drive F desktop di jaringan. Lalu saya bisa mengkloningnya di laptop saya dengan menjalankan:
F: git clone 'file://///DESKTOP-PC/f'
Sayangnya, semua file berakhir di bawah "F: \ f \" di laptop saya, bukan di bawah F: \ secara langsung. Tapi saya bisa memotong dan menempelkannya secara manual. Git masih bekerja dari lokasi baru sesudahnya.
Kemudian saya mencoba membuat beberapa perubahan pada file di laptop, membuatnya, dan mendorongnya kembali ke desktop. Itu tidak berhasil sampai saya menjalankan perintah git config yang disebutkan di atas.
Perhatikan bahwa saya menjalankan semua perintah ini dari dalam Windows PowerShell, di kedua mesin.
UPDATE: Saya masih memiliki masalah mendorong perubahan, dalam beberapa kasus. Saya akhirnya baru mulai menarik perubahan, dengan menjalankan yang berikut di komputer saya ingin menarik komit terbaru ke:
git pull --all --prune
sumber
git config receive.denyCurrentBranch updateInstead
Karena sudah ada repositori yang ada, jalankan
pada repositori jarak jauh sudah cukup
Dari dokumentasi core.bare
Jika true (bare = true), repositori diasumsikan kosong tanpa direktori kerja yang terkait. Jika demikian, sejumlah perintah yang memerlukan direktori yang berfungsi akan dinonaktifkan, seperti git-add atau git-merge (tetapi Anda akan dapat mendorongnya).
Pengaturan ini secara otomatis ditebak oleh git-clone atau git-init ketika repositori dibuat. Secara default repositori yang diakhiri dengan "/.git" diasumsikan tidak kosong (bare = false), sementara semua repositori lainnya diasumsikan kosong (bare = true).
sumber
TLDR
git pull &&& git push
.git push origin master:foo
dan gabungkan pada repo jarak jauh.-f
(denyCurrentBranch
perlu diabaikan).Pada dasarnya kesalahan berarti bahwa repositori Anda tidak up-to-date dengan kode jarak jauh (indeks dan pohon kerjanya tidak konsisten dengan apa yang Anda dorong).
Biasanya Anda harus
pull
terlebih dahulu mendapatkan perubahan terbaru danpush
melakukannya lagi.Jika tidak akan membantu, cobalah mendorong ke cabang lain, misalnya:
kemudian gabungkan cabang ini pada repositori jarak jauh kembali dengan master.
Jika Anda mengubah beberapa komit sebelumnya dengan sengaja
git rebase
dan Anda ingin mengganti repo dengan perubahan Anda, Anda mungkin ingin memaksakan dorongan dengan menambahkan-f
/--force
parameter (tidak disarankan jika Anda tidak melakukannyarebase
). Jika masih tidak berfungsi, Anda perlu mengaturreceive.denyCurrentBranch
keignore
jarak jauh seperti yang disarankan oleh pesan git melalui:sumber
Mungkin repo jarak jauh Anda ada di cabang yang ingin Anda dorong. Anda dapat mencoba checkout cabang lain di mesin jarak jauh Anda. Saya melakukan ini, daripada kesalahan ini hilang, dan saya mendorong kesuksesan ke repo jarak jauh saya. Perhatikan bahwa saya menggunakan ssh untuk menghubungkan server saya sendiri dan bukan github.com.
sumber
Saya memiliki kesalahan ini karena repo git (secara tidak sengaja) diinisialisasi dua kali di lokasi yang sama: pertama sebagai repo non-telanjang dan segera setelah sebagai repo telanjang. Karena folder .git tetap, git menganggap repositori itu tidak kosong. Menghapus folder .git dan data direktori kerja menyelesaikan masalah.
sumber
.git
folder pada remote memungkinkan saya untuk menekan komit awal.Saya mendapatkan kesalahan ini ketika saya bermain-main saat membaca progit. Saya membuat repositori lokal, lalu mengambilnya dalam repo lain pada sistem file yang sama, melakukan pengeditan dan mencoba mendorong. Setelah membaca jawaban NowhereMan, perbaikan cepat adalah pergi ke direktori "remote" dan sementara memeriksa komit lain, mendorong dari direktori saya membuat perubahan, kemudian kembali dan meletakkan kembali kepala pada master.
sumber