master (cabang saat ini diperiksa)''/> master (cabang saat ini diperiksa)''/> master (cabang saat ini diperiksa)''/> Git push error 'master [remote reject] -> master (cabang saat ini diperiksa)' | gomecomputer.com

Pertanyaan Git push error 'master [remote reject] -> master (cabang saat ini diperiksa)'


Kemarin, saya memposting pertanyaan tentang cara mengkloning Git repositori dari salah satu mesin saya ke yang lain, Bagaimana saya bisa 'git clone' dari komputer lain?.

Saya sekarang berhasil mengkloning repositori Git dari sumber saya (192.168.1.2) ke tujuan saya (192.168.1.1).

Tetapi ketika saya melakukan pengeditan ke file, a git commit -a -m "test" dan a git push, Saya mendapatkan kesalahan ini di tujuan saya (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'

Saya menggunakan dua versi Git yang berbeda (1.7 pada remote dan 1.5 pada mesin lokal). Apakah itu alasan yang mungkin?


877
2018-05-12 06:06


asal


Jawaban:


Anda dapat dengan mudah mengkonversi repositori jarak jauh Anda ke repositori kosong (tidak ada copy pekerjaan dalam repositori kosong - folder hanya berisi data repositori yang sebenarnya).

Jalankan perintah berikut di folder repositori jarak jauh Anda:

git config --bool core.bare true

Lalu hapus semua file kecuali .git di folder itu. Dan kemudian Anda akan bisa tampil git push ke repositori jarak jauh tanpa kesalahan apa pun.


1066
2017-07-14 22:45



Saya baru saja mengalami kesalahan yang sama ketika saya mulai belajar Git. Beberapa jawaban lainnya jelas bukan untuk seseorang yang baru mengenal Git!

(Saya akan menggunakan istilah non teknis untuk menyampaikan ide.) Bagaimanapun, yang terjadi adalah Anda memiliki dua repositori, yang pertama adalah yang pertama Anda buat, dan yang lainnya adalah karya yang baru saja Anda buat.

Saat ini Anda berada di repositori pekerjaan Anda dan menggunakan cabang "master". Tetapi Anda juga kebetulan "masuk" di repositori asli Anda ke cabang "master" yang sama. Sekarang karena Anda "masuk" dalam bahasa aslinya, Git takut Anda mungkin mengacaukan karena Anda mungkin mengerjakan yang asli dan mengacaukan segalanya. Jadi, Anda perlu kembali ke repositori asli dan melakukan "git checkout someotherbranch", dan sekarang Anda dapat mendorong tanpa masalah.

Saya harap ini membantu.


644
2018-05-29 03:26



Pesan kesalahan menggambarkan apa yang telah terjadi. Versi lebih modern dari Git menolak untuk memperbarui cabang melalui push jika cabang tersebut dicentang.

Cara termudah untuk bekerja di antara dua repositori yang tidak kosong adalah

  1. selalu perbarui repositori dengan menarik (atau mengambil dan menggabungkan) atau, jika Anda harus,

  2. dengan mendorong ke cabang terpisah (cabang impor) dan kemudian menggabungkan cabang tersebut ke dalam cabang master pada mesin jarak jauh.

Alasan untuk pembatasan ini adalah bahwa operasi push hanya beroperasi pada repositori Git remote, tidak memiliki akses ke indeks dan pohon kerja. Jadi, jika diizinkan, dorongan pada cabang yang dicentang akan mengubah  HEAD  tidak konsisten dengan indeks dan pohon yang berfungsi pada repositori jarak jauh.

Ini akan membuatnya sangat mudah untuk secara tidak sengaja melakukan perubahan yang membatalkan semua perubahan yang didorong dan juga membuatnya sangat sulit untuk membedakan antara perubahan lokal apa saja yang belum dilakukan dan perbedaan antara yang baru HEAD, indeks dan pohon kerja yang disebabkan oleh dorongan bergerak HEAD.


118
2018-05-12 06:21



Ringkasan

Anda tidak dapat mendorong ke cabang pemeriksaan satu dari repositori karena akan mengacaukan pengguna repositori itu dengan cara yang kemungkinan besar akan diakhiri dengan kehilangan data dan sejarah. Tetapi Anda dapat mendorong ke cabang lain dari repositori yang sama.

Karena repositori kosong tidak pernah memiliki cabang yang dicentang, Anda selalu dapat mendorong ke cabang mana pun dari repositori kosong.

Ada beberapa solusi, tergantung kebutuhan Anda.

Solusi 1: Gunakan Repostiory Bare

Seperti yang disarankan, jika pada satu mesin, Anda tidak memerlukan direktori kerja, Anda dapat pindah ke repositori kosong. Agar tidak mengacaukan repositori, Anda bisa mengkloningnya:

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

Sekarang Anda dapat mendorong semua yang Anda inginkan ke alamat yang sama seperti sebelumnya.

Solusi 2: Dorong ke Cabang yang Tidak Di-Check-Out

Tetapi jika Anda perlu memeriksa kode pada remote Anda <remote>, maka Anda dapat menggunakan cabang khusus untuk mendorong. Katakanlah di repositori lokal Anda, Anda telah memanggil remote control Anda origin dan Anda berada di cabang. Maka Anda bisa melakukannya

machine2$ git push origin master:master+machine2

Maka Anda perlu menggabungkannya ketika Anda berada di origin repo jarak jauh:

machine1$ git merge master+machine2

Autopsi Masalah

Ketika sebuah cabang diperiksa, commit akan menambahkan komit baru dengan kepala cabang saat ini sebagai induknya dan memindahkan kepala cabang menjadi komitmen baru.

Begitu

A ← B
    ↑
[HEAD,branch1]

menjadi

A ← B ← C
        ↑
    [HEAD,branch1]

Tetapi jika seseorang dapat mendorong ke peralihan cabang itu, pengguna akan mendapatkan dirinya sendiri dalam panggilan git apa kepala terpisah mode:

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

Sekarang pengguna tidak di cabang1 lagi, tanpa secara eksplisit diminta untuk memeriksa cabang lain. Lebih buruk lagi, pengguna sekarang di luar cabang mana saja, dan hanya ada komitmen baru teruntai:

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

Secara hipotesis, jika pada titik ini, pengguna memeriksa cabang lain, maka ini menjuntai komit menjadi permainan yang adil untuk Git pemulung.


102
2018-02-14 16:28



Anda bisa mendapatkan sekitar "batasan" ini dengan mengedit .git/config di server tujuan. Tambahkan hal-hal berikut untuk memungkinkan repositori git didorong ke bahkan jika "dicentang":

[receive]
denyCurrentBranch = warn

atau

[receive]
denyCurrentBranch = false

Yang pertama akan memungkinkan push sambil memperingatkan kemungkinan untuk mengacaukan cabang, sedangkan yang kedua akan diam-diam membiarkannya.

Ini dapat digunakan untuk "menyebarkan" kode ke server yang tidak dimaksudkan untuk diedit. Ini bukan pendekatan terbaik, tetapi yang cepat untuk menerapkan kode.


52
2017-12-16 05:17



Saya suka ide masih memiliki repositori yang dapat digunakan pada kotak remote, tetapi bukannya cabang dummy, saya suka menggunakan:

git checkout --detach

Ini tampaknya menjadi fitur yang sangat baru Git - Saya menggunakan git versi 1.7.7.4.


38
2018-02-14 20:37



git config --local receive.denyCurrentBranch updateInstead

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

Gunakan itu di repositori server, dan itu juga memperbarui pohon yang berfungsi jika tidak terjadi overwrite yang tidak terlacak.

Itu ditambahkan dalam Git 2.3 sebagai disebutkan oleh VonC di komentar.

Saya telah mengkompilasi Git 2.3 dan mencobanya. Contoh penggunaan:

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

Keluaran:

a
b

Yay, b terdorong!


31
2018-02-07 14:57