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

961

Kemarin, saya memposting pertanyaan tentang cara mengkloning repositori Git dari satu komputer saya ke yang lain, Bagaimana saya bisa 'git klon' 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 edit ke file, a git commit -a -m "test"dan a git push, saya mendapatkan kesalahan ini pada tujuan saya (192.168.1.1):

git push                                                
[email protected]'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://[email protected]/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://[email protected]/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?

hap497
sumber
5
Bisakah old-timer mengubah jawaban yang diterima ke stackoverflow.com/a/9283833/397872 dan memindahkan utas ke arsip atau sesuatu? Atau mengubah kepemilikan atau apa pun?
rishta
9
Anda sebenarnya sekarang memiliki cara yang aman untuk mendorong ke repo non-telanjang dengan Git 2.3.0 (Februari 2015) dan git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309
VonC
Itulah tautan baru buku yang telah disebutkan oleh @stigi
Abdelilah El Aissaoui
Tapi saya tidak mengerti mengapa dan bagaimana cara kerjanya? Ini berfungsi, Ya, tapi hanya itu.
Tilak Maddy

Jawaban:

1149

Anda cukup mengonversi repositori jauh ke repositori kosong (tidak ada salinan yang berfungsi di repositori kosong - folder hanya berisi data repositori yang sebenarnya).

Jalankan perintah berikut di folder repositori jarak jauh Anda:

git config --bool core.bare true

Kemudian hapus semua file kecuali .gitdi folder itu. Dan kemudian Anda akan dapat melakukan git pushke repositori jarak jauh tanpa kesalahan.

John
sumber
4
Terima kasih. Saya juga membutuhkan ini. Saya mengikuti tutorial submodules dari Git Community Book dan menemukan penghalang ini.
Shiki
6
Saya tidak yakin apakah Anda bermaksud menghapus file di server, atau klien ... jadi saya tidak menghapus apa pun, dan masalah hilang setelah hanya melakukan git config --bool core.bare true. Apakah ada alasan tertentu mengapa beberapa file perlu dihapus? Jika demikian, dapatkah Anda lebih tepat tentang apa yang perlu dihapus?
Brian Vandenberg
24
Ini adalah jawaban terbaik dan tidak ada orang lain yang menyediakannya di lubang Interwebs. Saya pikir kami semua mencari di Google pesan kesalahan yang sama dan kami semua sangat senang membaca ini.
Sebastián Grignoli
40
Meskipun mendapat banyak suara, saya kira ini bukan jawaban yang cukup memadai untuk pertanyaan spesifik itu. Mengajari pengguna cara membuat repo kosong akan setengah buruk, tetapi bagaimana jika file perlu tetap diperiksa, misalnya saat repositori yang digunakan pengguna pada dua komputer?
Tidak ada pria
9
Mengubah repo sumber ke telanjang adalah berlebihan. Yang perlu Anda lakukan adalah mendorong ke cabang baru di repo sumber, seperti yang ditunjukkan @Robert: stackoverflow.com/a/2933656/402949 .
Dan Solovay
708

Saya hanya memiliki kesalahan yang sama ketika saya mulai belajar Git . Beberapa jawaban lain jelas bukan untuk seseorang yang baru mengenal Git!

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

Saat ini Anda berada di repositori kerja Anda dan menggunakan cabang "master". Tetapi Anda juga "login" di repositori asli ke cabang "master" yang sama. Sekarang karena Anda "masuk" dalam dokumen asli, Git khawatir Anda mungkin mengacaukannya karena Anda mungkin mengerjakan yang asli dan mengacaukan semuanya. Jadi, Anda perlu kembali ke repositori asli dan melakukan "git checkout someotherbranch", dan sekarang Anda bisa mendorong tanpa masalah.

Saya harap ini membantu.

Robert Gould
sumber
76
+1 Jauh lebih bermanfaat, terima kasih Robert. Saya tidak masuk akal untuk mengkonversi ke repo telanjang dalam kasus saya. Cukup 'nonaktifkan' cabang yang ingin Anda dorong. Masuk akal.
Eric Muyser
32
@ FMaz008: cukup buat cabang dummy (git checkout -b dummy)
Dror Cohen
14
Man ini jauh lebih baik daripada jawaban kebanyakan orang :) Terima kasih. Meskipun jawaban yang lain juga baik :)
Ivan Ivanić
103
Hanya untuk membuat ini lebih jelas, di repo itulah target push: git checkout -b tmp. Kemudian pada sumber repo: git push. Kemudian kembali ke target (opsional):git checkout master; git branch -d tmp
Hari Karam Singh
18
Komentar Hari adalah resep paling sederhana. Saya hanya perlu mengatakan bahwa walaupun git mungkin hebat dalam banyak hal, berasal dari svn atau mungkin rv lain, semua ini sangat tidak intuitif.
UnconditionalReinstateMonica
128

Pesan kesalahan menjelaskan apa yang terjadi. Versi Git yang lebih modern menolak untuk memperbarui cabang melalui push jika cabang itu dicentang.

Cara termudah untuk bekerja di antara dua repositori non-telanjang adalah dengan

  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 itu ke cabang master pada mesin jarak jauh.

Alasan pembatasan ini adalah bahwa operasi push hanya beroperasi pada repositori Git jarak jauh, ia tidak memiliki akses ke indeks dan pohon kerja. Jadi, jika diizinkan, dorongan pada cabang check-out akan mengubah HEAD tidak konsisten dengan indeks dan pohon kerja 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 setiap perubahan lokal yang belum dilakukan dan perbedaan antara yang baru HEAD, indeks dan pohon kerja yang telah disebabkan oleh dorongan bergerak HEAD.

CB Bailey
sumber
1
Terima kasih. Jadi bagaimana saya bisa memperbaiki masalah saya? Di kotak 192 saya, saya melakukan '$ cd (proyek-direktori) $ git init $ (tambahkan beberapa file) $ git add.' dan kemudian di kotak 191 saya, saya melakukan 'git clone' dan mengedit beberapa file dan daripada mencoba 'git push'.
hap497
16
Yah, saya menggambarkan kemungkinan dalam jawaban saya. Entah Anda bisa pergi ke kotak 192 dan mengambil dari kotak 191 (Anda mungkin ingin menambahkan kotak 191 sebagai remote - lihat bernama git remote add box191 <191url>), atau Anda bisa mendorong dari kotak 191 ke cabang bernama alternatif (misalnya git push origin master:refs/heads/upload), lalu ke kotak 192 dan bergabung (misalnya git merge upload).
CB Bailey
3
Anda sebenarnya sekarang memiliki cara aman untuk mendorong ke repo non-telanjang dengan Git 2.3.0 (Februari 2015) dan git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309 : Anda tidak perlu opsi 2 lagi.
VonC
122

Ringkasan

Anda tidak dapat mendorong ke cabang yang dicek dari repositori 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.

Ada beberapa solusi, tergantung kebutuhan Anda.

Solusi 1: Gunakan Bare Repostiory

Seperti yang disarankan, jika pada satu mesin, Anda tidak memerlukan direktori kerja, Anda dapat pindah ke repositori kosong. Untuk menghindari 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 Dicentang

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 originAnda dan Anda berada di master cabang. Maka Anda bisa melakukannya

machine2$ git push origin master:master+machine2

Maka Anda harus menggabungkannya saat berada di originrepo jarak jauh:

machine1$ git merge master+machine2

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

A ← B
    ↑
[HEAD,branch1]

menjadi

A ← B ← C
        ↑
    [HEAD,branch1]

Tetapi jika seseorang bisa mendorong ke peralihan cabang itu, pengguna akan mendapatkan dirinya sendiri dalam apa yang disebut git mode head terpisah :

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

Sekarang pengguna tidak lagi di branch1, tanpa diminta secara eksplisit untuk memeriksa cabang lain. Lebih buruk lagi, pengguna sekarang di luar cabang apa pun , dan komit baru apa pun hanya akan menggantung :

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

Hipotetis, jika pada titik ini, pengguna memeriksa cabang lain, maka komit menggantung ini menjadi permainan yang adil bagi pengumpul sampah Git .

Tidak ada pria
sumber
3
Satu koreksi teknis untuk "autopsi": git tidak akan benar-benar lepas HEADdalam repositori push-to. HEADmasih akan menunjuk ke cabang, dan cabang pada gilirannya akan menunjuk ke komit baru yang didorong; tetapi direktori kerja dan area indeks / staging tidak akan dimodifikasi. Siapa pun yang bekerja di repositori push-to sekarang harus bekerja keras untuk pulih dari efek push: cari tahu apakah ada perubahan untuk disimpan, dan jika demikian hati-hati mengatur untuk menyimpannya.
torek
Untuk menambahkan informasi tambahan ke jawaban Anda, ada beberapa alasan mengapa Anda ingin repositori jarak jauh yang orang dorong menjadi non-telanjang, jadi menggunakan repositori kosong adalah solusi terbaik.
2
Sebenarnya, saya menemukan banyak situasi ketika saya perlu mendorong ke repositori non-telanjang, dan saya menggunakan solusi 2 cukup banyak. Juga, cabang tempat saya mendorong repositori non-telanjang sama sekali bukan cabang sementara, ia melayani tujuan yang sama sebagai cabang pelacakan jarak jauh.
Tidak ada tempat
Saya membuat folder GIT di server saya yang akan menampung SEMUA repositori yang dibuat oleh banyak pengguna menggunakan SourceTree. Saya membuat masterrepositori di PC lokal saya. Saya menambahkannya remoteske folder server dan mencoba mendorong repositori saya ke server sehingga pengguna lain dapat menarik / mengambilnya untuk bekerja. Saya mendapatkan kesalahan berikut: ! [remote rejected] master -> master (branch is currently checked out)Bagaimana saya bisa memeriksanya?
SearchForKnowledge
1
@SearchForKnowledge, apakah Anda sadar bahwa Anda mengajukan pertanyaan yang saya jawab dengan tepat ?!
Tidak ada pria
65

Anda dapat menyiasati "batasan" ini dengan mengedit .git/configpada server tujuan. Tambahkan yang berikut ini untuk memungkinkan repositori git untuk didorong bahkan jika itu "diperiksa":

[receive]
denyCurrentBranch = warn

atau

[receive]
denyCurrentBranch = false

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

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

Keris
sumber
7
Menggunakan ini untuk "menyebarkan" kode ke server tidak akan berfungsi. Bahkan jika Anda menonaktifkan peringatan sehingga Anda bisa mendorong ke cabang diperiksa, copy pekerjaan tidak akan pernah diperbarui pada dorongan.
Arrowmaster
10
Saya menggunakan metode di atas dengan cd .. && git reset --hardkait pasca-terima untuk digunakan. Meretas, tetapi berhasil.
jholster
9
versi baris perintah yang terakhir adalahgit config receive.denyCurrentBranch warn
Andre Holzner
4
Ini harus menjadi jawaban yang diterima. Beberapa dari kita tahu apa yang kita lakukan dan bukan pemula Git. Ini jawaban untuk orang-orang itu.
Qix - MONICA DISALAHKAN
2
Ha, tetapi pertanyaan itu tidak diajukan oleh orang - orang itu.
Tidak ada pria
46

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 kerja jika tidak ada timpa yang tidak terlacak akan terjadi.

Itu ditambahkan di Git 2.3 seperti yang disebutkan oleh VonC dalam komentar.

Saya telah mengkompilasi Git 2.3 dan mencobanya. Penggunaan sampel:

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, bdidorong!

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
@VonC terima kasih! Ini obsesi saya dengan contoh minimal di tempat kerja :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Apakah ini memiliki masalah dengan melakukan perubahan yang tidak mutakhir dengan server?
akozi
@akozi Saya tidak yakin apa yang Anda maksud, jika Anda komit secara lokal sebelum menarik, itu akan berperilaku persis seperti --bareklon tradisional saya pikir: --forcediperlukan untuk mendorong, dan itu akan membuat Anda "kehilangan" melakukan pada remote.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 Jangan khawatir sekarang. Saya mencari arti dari opsi-opsi itu. Saya pikir updateInstead identik dengan kekuatan.
akozi
updateInstead tidak lagi menjadi nilai yang valid untuk
accept.denyCurrentBranch
41

Saya suka gagasan masih memiliki repositori yang dapat digunakan di kotak remote, tetapi alih-alih cabang dummy, saya suka menggunakan:

git checkout --detach

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

stackdump
sumber
8
Dan kemudian setelah mendorong perubahan Anda, Anda dapat menggunakan: git checkout masteruntuk kembali ke cabang utama. Baru saat itulah perubahan Anda diterapkan.
MAZDAK
30

Saya memiliki masalah yang sama. Bagi saya, saya menggunakan Git push untuk memindahkan kode ke server saya. Saya tidak pernah mengubah kode di sisi server, jadi ini aman.

Di repositori, Anda mendorong untuk mengetik:

git config receive.denyCurrentBranch ignore

Ini akan memungkinkan Anda untuk mengubah repositori saat itu adalah copy yang berfungsi.

Setelah Anda menjalankan Git push, buka mesin jarak jauh dan ketik ini:

git checkout -f

Ini akan membuat perubahan yang Anda dorong tercermin dalam copy pekerjaan mesin jarak jauh.

Harap dicatat, ini tidak selalu aman jika Anda membuat perubahan pada copy pekerjaan yang Anda dorong.

Orbital_sFear
sumber
terima kasih log, saya gabungkan saran Anda denyCurrentBranchdan letakkan git checkout -fdi dalam hooksfolder seperti @ jack-senechal yang diposting di sini
Éderson T. Szlachta
Apakah ada cara untuk membuat file muncul di repositori Remote tanpa pergi ke sana dan melakukan perintah ini? Yaitu dengan perintah dari lokal?
Royi
24

Anda dapat membuat ulang repositori server Anda dan mendorong dari master cabang lokal Anda ke master server.

Di server jauh Anda:

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

OKE, dari cabang lokal Anda:

git push origin master:master
nau
sumber
3
Terima kasih ini adalah solusi untuk saya karena saya telah menghilangkan '--bare' di server jauh. Tampaknya jawaban untuk pertanyaan ini bergantung pada apakah Anda menggunakan repo server jarak jauh sebagai direktori yang berfungsi atau tidak dan untuk kasus selanjutnya, ini adalah jawaban yang benar.
Cas
2
Saya tidak mengerti: SI mencoba membuat dan mengkloning repo telanjang, tetapi mengkloning tidak mengunduh dan mendorong apa pun yang diunggah, jadi ini tidak berfungsi ... :-) Saya membaca tutorial tentang repo telanjang, tetapi mereka mengatakan bahwa repo telanjang tidak mengandung file ... Itu jelas bukan yang saya cari ...
inf3rno
22

Apa yang mungkin Anda lakukan untuk menyebabkan ini:

Hal semacam ini terjadi ketika Anda pergi untuk menggedor program kecil. Anda akan mengubah sesuatu yang sudah berfungsi, jadi Anda merapalkan mantra tingkat-3 yang tidak dapat dibatalkan selamanya:

machine1:~/proj1> git init

dan Anda mulai menambahkan / melakukan. Tapi kemudian , proyek mulai lebih terlibat dan Anda ingin mengerjakannya dari komputer lain (seperti PC atau laptop di rumah), jadi Anda melakukan sesuatu seperti

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

dan itu klon dan semuanya terlihat bagus, dan Anda bekerja pada kode Anda dari machine2.

Kemudian ... Anda mencoba untuk mendorong komit Anda dari machine2, dan Anda mendapatkan pesan peringatan di judul.

Alasan untuk pesan ini adalah karena repo git yang Anda gunakan agaknya dimaksudkan untuk digunakan hanya untuk folder itu di machine1. Anda dapat mengkloningnya dengan baik, tetapi mendorong dapat menyebabkan masalah. Cara "tepat" untuk mengelola kode di dua lokasi berbeda adalah dengan repo "kosong", seperti yang disarankan. Repo telanjang tidak dirancang untuk melakukan pekerjaan apa pun di dalamnya, ini dimaksudkan untuk mengoordinasikan komitmen dari berbagai sumber. Inilah mengapa jawaban berperingkat teratas menyarankan menghapus semua file / folder selain dari folder .git setelah Andagit config --bool core.bare true .

Mengklarifikasi jawaban teratas: Banyak komentar untuk jawaban itu mengatakan sesuatu seperti "Saya tidak menghapus file non-.git dari machine1 dan saya masih dapat melakukan dari machine2". Betul. Namun, file-file lain sepenuhnya "bercerai" dari git repo, sekarang. Coba git statusdi sana dan Anda akan melihat sesuatu seperti "fatal: Operasi ini harus dijalankan di pohon kerja". Jadi, saran untuk menghapus file tidak agar komit dari machine2 akan bekerja ; itu agar Anda tidak bingung dan berpikir bahwa git masih melacak file-file itu. Tetapi, menghapus file adalah masalah jika Anda masih ingin mengerjakan file pada machine1, bukan?

Jadi, apa yang harus Anda lakukan?

Tergantung pada seberapa banyak Anda berencana untuk masih bekerja pada machine1 dan machine2 ...

Jika Anda selesai mengembangkan dari machine1 dan telah memindahkan semua pengembangan Anda ke machine2 ... lakukan saja apa yang disarankan oleh jawaban teratas: git config --bool core.bare truedan kemudian, secara opsional, hapus semua file / folder selain .git dari folder itu, karena mereka Sedang tidak terlacak dan kemungkinan menyebabkan kebingungan.

Jika pekerjaan Anda pada machine2 hanya satu kali, dan Anda tidak perlu melanjutkan pengembangan di sana ... maka jangan repot-repot membuat repo telanjang; hanya ftp / rsync / scp / etc. file Anda dari mesin * 2 * di atas file di mesin * 1 *, komit / dorong dari mesin * 1 *, dan kemudian hapus file dari mesin * 2 *. Yang lain menyarankan untuk membuat cabang, tapi saya pikir itu sedikit berantakan jika Anda hanya ingin menggabungkan beberapa pengembangan yang Anda lakukan satu kali dari komputer lain.

Jika Anda perlu melanjutkan pengembangan pada machine1 dan machine2 ... maka Anda perlu mengatur semuanya dengan benar. Anda perlu mengubah repo Anda menjadi telanjang, maka Anda harus membuat kloning itu pada machine1 agar Anda dapat bekerja . Mungkin cara tercepat untuk melakukan ini adalah dengan melakukan

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

Sangat penting: karena Anda telah memindahkan lokasi repo dari proj1 ke proj1.git, Anda perlu memperbarui ini dalam file .git / config pada machine2 . Setelah itu, Anda dapat melakukan perubahan dari mesin2. Terakhir, saya mencoba untuk menyimpan repo kosong saya di lokasi pusat, jauh dari pohon kerja saya (yaitu jangan meletakkan 'proj1.git' dalam folder induk yang sama dengan 'proj1'). Saya menyarankan Anda untuk melakukan hal yang sama, tetapi saya ingin menjaga langkah-langkah di atas sesederhana mungkin.

Jemenake
sumber
Sangat detail dan bermanfaat. Kasing saya adalah yang terakhir, dan instruksi Anda bekerja seperti mantra.
pojda
Saya dalam kasus 3 dan saya melakukan sesuatu yang sedikit berbeda: mk git-server; mv. git git-server / proj.git dan kemudian git klon git-server / proj.git ke 1 dan 2 (atau git asal jauh ...), menggunakan ssh yang tepat: // awalan untuk mesin 2. Dengan cara ini Saya akan menyimpan salinan master kosong yang akan seperti yang normal di GH atau server HTTP lain dan saya akan tetap menggunakan push / pull di kedua mesin.
zakmck
18

Dengan beberapa langkah pengaturan Anda dapat dengan mudah menyebarkan perubahan ke situs web Anda menggunakan one-liner like

git push production

Yang bagus dan sederhana, dan Anda tidak perlu masuk ke server jauh dan melakukan tarik atau apa pun. Perhatikan bahwa ini akan bekerja paling baik jika Anda tidak menggunakan checkout produksi Anda sebagai cabang kerja! (OP bekerja dalam konteks yang sedikit berbeda, dan saya pikir solusi @Robert Gould mengatasinya dengan baik. Solusi ini lebih tepat untuk ditempatkan ke server jarak jauh.)

Pertama, Anda perlu mengatur repositori telanjang di suatu tempat di server Anda, di luar webroot Anda.

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

Kemudian buat file hooks/post-receive:

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

Dan buat file tersebut dapat dieksekusi:

chmod +x hooks/post-receive

Di mesin lokal Anda,

git remote add production [email protected]:mywebsite.git
git push production +master:refs/heads/master

Siap! Sekarang di masa depan Anda dapat menggunakan git push productionuntuk menyebarkan perubahan Anda!

Kredit untuk solusi ini masuk ke http://sebduggan.com/blog/deploy-your-website-changes-using-git/ . Lihat di sana untuk penjelasan yang lebih terperinci tentang apa yang terjadi.

Jack Senechal
sumber
Saran Anda banyak membantu saya, tetapi saya tidak menggunakannya bare, saya ikuti ini dan bergabung dengan hooks(yang Anda sarankan) dan bekerja dengan sempurna.
Éderson T. Szlachta
11

Anda seharusnya hanya mendorong ke repositori kosong. Repositori kosong adalah repositori yang tidak memiliki cabang yang diperiksa. Jika Anda ingin cd ke direktori repositori telanjang, Anda hanya akan melihat isi direktori .git.

RibaldEddie
sumber
9
Tidak ada yang salah dengan mendorong ke cabang yang tidak diperiksa dalam repositori non-telanjang. Ini adalah cara kerja yang sangat valid.
CB Bailey
Cukup adil, itu akan berhasil. Tapi bukan itu yang dilakukan pengguna.
RibaldEddie
13
Bukan fakta bahwa dia tidak menggunakan repositori telanjang yang 'salah'; itu adalah fakta bahwa dia mendorong ke cabang yang dicek. Tidak ada bukti bahwa ia memiliki atau menginginkan repositori telanjang yang terpisah sehingga pernyataan selimut Anda bahwa ia seharusnya hanya mendorong ke repositori non-telanjang tidak memberi si penanya semua opsi; salah satunya mungkin lebih mudah menyelesaikan masalah langsungnya.
CB Bailey
10

Anda memiliki 3 opsi

  1. Tarik dan dorong lagi:

    git pull; git push
    
  2. Dorong ke cabang yang berbeda:

    git push origin master:foo
    

    dan menggabungkannya di remote (baik dengan gitatau menarik-permintaan )

    git merge foo
    
  3. Paksakan (tidak disarankan kecuali Anda dengan sengaja mengubah komit melalui rebase):

    git push origin master -f
    

    Jika masih ditolak, nonaktifkan denyCurrentBranch pada repositori jarak jauh:

    git config receive.denyCurrentBranch ignore
    
kenorb
sumber
Opsi 2 berfungsi untuk saya. remote git init git lokal push master asal: cabang git remote menggabungkan DILAKUKAN
Jacky Chong
7

Bahkan, mengatur jarak jauh ke cabang yang tidak diperiksa sudah cukup. Setelah Anda memeriksa jarak jauh di cabang lain, Anda bisa mendorong.

sebthemonster
sumber
7

Periksa .git/configproyek Anda di tujuan:

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

Jika core. bareitu salah, Anda dapat mengaturnya ke true:

$ git config core.bare true

dan kemudian di push lokal Anda ke jarak jauh:

git push remote_repo   // suppose the destination repo is remote_repo

itu akan berhasil, di remote_repo Anda dapat memeriksa versi git.

$ git log -1
commit 0623b1b900ef7331b9184722a5381bbdd2d935ba
Author: aircraft < [email protected]>
Date:   Thu May 17 21:54:37 2018 +0800

dan sekarang Anda tidak dapat menggunakan git di "ruang kerja" Anda:

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

Anda harus mengatur bare.barekembali ke false.

$ git config core.bare false
pesawat terbang
sumber
5

Saya memiliki masalah yang sama menggunakan Git untuk menyinkronkan repositori di ponsel Android dan laptop saya. Solusi bagi saya adalah melakukan tarikan alih-alih dorongan, seperti yang disarankan @CharlesBailey.

git push origin master pada repositori Android gagal bagi saya dengan pesan kesalahan yang sama yang didapat @ hap497 karena dorongan untuk checkout non-telanjang dari repositori + copy pekerjaan.

git pull droid masterpada repositori laptop dan copy pekerjaan bekerja untuk saya. Tentu saja, Anda sebelumnya harus menjalankan sesuatu git remote add droid /media/KINGSTON4GB/notes_repo/.

hobs
sumber
4

Versi Git yang lebih lama digunakan untuk memungkinkan push ke cabang repositori non-telanjang yang saat ini diperiksa.

Ternyata ini adalah hal yang sangat membingungkan untuk dibiarkan. Jadi mereka menambahkan pesan peringatan yang Anda lihat, yang juga sangat membingungkan.

Jika repositori pertama hanya bertindak sebagai server, maka konversikan ke repositori kosong sebagai jawaban lain merekomendasikan dan dilakukan dengan itu.

Namun, jika Anda perlu memiliki cabang bersama antara dua repo yang keduanya digunakan Anda dapat mencapainya dengan pengaturan berikut

Repo1 - akan bertindak sebagai server dan juga digunakan untuk pengembangan

Repo2 - hanya untuk pengembangan

Atur Repo1 sebagai berikut

Buat cabang untuk berbagi pekerjaan.

git branch shared_branch

Agar aman, Anda juga harus membuat $ (REPO) .git / hooks / update yang menolak perubahan apa pun selain shared_branch, karena Anda tidak ingin orang-orang mucking dengan cabang pribadi Anda.

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

Sekarang buat cabang lokal di repo1 di mana Anda akan melakukan pekerjaan Anda yang sebenarnya.

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'

(mungkin perlu git config --global push.default upstreamuntuk git pushbekerja)

Sekarang Anda dapat membuat repo2 dengan

git clone path/to/repo1 repo2 
git checkout shared_branch 

Pada titik ini Anda memiliki pengaturan repo1 dan repo2 untuk bekerja pada cabang lokal yang mendorong dan menarik dari shared_branchdalam repo1, tanpa perlu khawatir tentang pesan kesalahan itu atau membuat direktori kerja keluar dari sinkronisasi di repo1. Apa pun alur kerja normal yang Anda gunakan harus berhasil.

Andrew C
sumber
3

OK, jika Anda menginginkan repositori jarak jauh yang normal, lalu buat cabang tambahan dan periksa. Dorong ke dalam satu cabang (yang tidak dicentang) dan gabungkan dengan satu cabang yang saat ini aktif setelah mendorong dari lokal.

Misalnya, pada server jarak jauh:

git branch dev
git checkout dev

Pada pengaturan lokal:

git push 

Di server jarak jauh:

git merge dev
Tuan Coder
sumber
2

Berikut adalah satu tes yang dapat Anda lakukan untuk melihat cara kerja bareserver:

Bayangkan Anda memiliki workstation dan server dengan situs live yang dihosting di dalamnya, dan Anda ingin memperbarui situs ini dari waktu ke waktu (ini juga berlaku untuk situasi di mana dua pengembang mengirim pekerjaan mereka bolak-balik melalui perantara telanjang).

Inisialisasi

Buat beberapa direktori di komputer lokal Anda dan cdmasuk ke dalamnya, kemudian jalankan perintah-perintah ini:

# initialization
git init --bare server/.git
git clone server content
git clone server local
  1. Pertama, Anda membuat telanjang server direktori (perhatikan. Git di akhir). Direktori ini akan berfungsi sebagai wadah untuk file repositori Anda saja.
  2. Kemudian klon repositori server Anda ke yang baru dibuat content direktori yang . Ini adalah direktori live / produksi Anda yang akan dilayani oleh perangkat lunak server Anda.
  3. Dua direktori pertama berada di server Anda, yang ketiga adalah direktori lokal di workstation Anda.

Alur kerja

Sekarang di sini adalah alur kerja dasar:

  1. Masukkan localdirektori, buat beberapa file dan komit. Akhirnya dorong mereka ke server:

    # create crazy stuff
    git commit -av
    git push origin master
    
  2. Sekarang masukkan contentdirektori dan perbarui konten server:

    git pull
    
  3. Ulangi 1-2. Di sini contentmungkin ada pengembang lain yang bisa mendorong ke server juga, dan localkarena Anda mungkin menarik darinya.

simo
sumber
2

Menggunakan ini untuk mendorongnya ke cabang hulu terpencil memecahkan masalah ini untuk saya:

git push <remote> master:origin/master

Remote tidak memiliki akses ke repo hulu jadi ini adalah cara yang baik untuk mendapatkan perubahan terbaru ke remote itu

jontro
sumber
1
Lebih umum (karena ini adalah efek bersih dari perintah), menggunakan git push <remote> master:newbranch. Idenya adalah bahwa Anda mendorong cabang baru ke remote, yang kemudian dapat digabungkan. Dengan cara ini Anda menghindari salah satu masalah inkonsistensi yang disebutkan dalam pesan kesalahan.
Clay
1

Saya harus menjalankan kembali git --initdi repositori telanjang yang ada, dan ini telah membuat .gitdirektori di dalam pohon repositori telanjang - saya menyadari bahwa setelah mengetik di git statussana. Saya menghapus itu dan semuanya baik-baik saja lagi :)

(Semua jawaban ini bagus, tetapi dalam kasus saya itu adalah sesuatu yang sangat berbeda (sejauh yang saya bisa lihat), seperti yang dijelaskan.)

Jan
sumber
1

Saya yakin sebagian besar orang yang melihat pertanyaan ini akan berhenti pada dua jawaban besar pertama, tetapi saya masih ingin menawarkan solusi saya.

Saya memiliki pengaturan proyek web Eclipse + EGit ketika menemukan kesalahan yang dijelaskan. Apa yang membantu saya hanyalah menggunakan aplikasi GitHub, yang tampaknya secara ajaib menyelesaikan masalah ini. Meskipun EGit akan selalu menolak dorongan, aplikasi desktop GitHub hanya akan mengangkat bahu dan mendorong perubahan saya. Mungkin itu menangani situasi multi-login lebih anggun.

pille
sumber
1

Artikel yang saya temukan yang mungkin bermanfaat bagi orang lain adalah Git dalam 5 menit .

Saya memiliki proyek Xcode di bawah kontrol versi Git yang ingin saya dorong ke Virtual Distributed Ethernet (VDE) yang saya miliki di DC. VDE menjalankan Centos 5.

Tak satu pun dari artikel yang saya baca tentang Git berbicara tentang repositori telanjang. Semuanya terdengar sangat sederhana sampai saya mencoba apa yang saya pikir seharusnya mudah berasal dari latar belakang SVN .

Saran di sini untuk membuat repositori jarak jauh kosong bekerja. Yang lebih baik untuk persyaratan saya adalah mengkloning proyek Xcode projectname.git, menyalinnya ke server jauh; kemudian mendorong bekerja secara ajaib. Langkah selanjutnya akan mendapatkan Xcode untuk mendorong tanpa kesalahan tentang komit, tetapi untuk sekarang saya baik-baik saja melakukannya dari Terminal.

Begitu:

cd /tmp (or another other directory on your system)<br/>
git clone --bare /xcode-project-directory projectname.git<br/>
scp -r projectname.git [email protected]:repos/<br/>

Untuk mendorong perubahan dari proyek Xcode Anda setelah Anda berkomitmen dalam Xcode:

cd /xcode-project-directory<br/>
git push [email protected]:repos/projectname.git<br/>

Saya yakin ada cara yang lebih lancar untuk melakukan hal di atas, tetapi setidaknya ini berfungsi. Agar semuanya jelas, berikut adalah beberapa klarifikasi: /xcode-project-directoryadalah direktori tempat proyek xcode Anda disimpan. Mungkin saja/Users/Your_Name/Documents/Project_Name . projectname secara harfiah adalah nama proyek, tetapi bisa apa saja yang Anda inginkan untuk menyebutnya. Git tidak peduli, kamu akan.

Untuk menggunakan scp, Anda harus memiliki akun pengguna di server jauh yang memungkinkan akses SSH . Siapa pun yang menjalankan server mereka sendiri akan memiliki ini. Jika Anda menggunakan hosting bersama atau sejenisnya, Anda mungkin kurang beruntung.

remotehost.comadalah nama host jarak jauh Anda. Anda dapat dengan mudah menggunakan alamat IP-nya. Hanya untuk kejelasan lebih lanjut, saya menggunakan Gitosis pada host jarak jauh dengan kunci SSH, jadi saya tidak dimintai kata sandi saat saya mendorong. Artikel Hosting Repositori Git, Cara Mudah (dan Aman) memberi tahu Anda cara mengatur semua itu.

Solusi Aplikasi Korutech
sumber
1

Cara terbaik untuk melakukan ini adalah:

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

Ini akan mengkloning repositori, tetapi tidak akan membuat salinan yang berfungsi di .../remote. Jika Anda melihat remote, Anda akan melihat satu direktori dibuat, disebut currentrepo.git, yang mungkin adalah yang Anda inginkan.

Kemudian dari repositori Git lokal Anda:

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

Setelah Anda melakukan perubahan, Anda dapat:

git push remoterepo master
Bill Donahue
sumber
1

Saya baru saja mengalami masalah ini dengan repositori git deployment pada Heroku .

Saya tidak tahu mengapa Heroku memiliki repositori non-telanjang di pihak mereka, tetapi sebagai solusi saya bisa mengatur ulang repositori jarak jauh, dan mengunggah ulang.

Anda tidak boleh menggunakan salinan repositori Heroku sebagai satu-satunya repositori git Anda untuk kolaborasi, tetapi untuk berjaga-jaga, saya akan mengatakan dengan jelas: Jangan lakukan ini kecuali Anda yakin Anda memiliki salinan lengkap dari repositori Anda yang disimpan dengan aman di tempat lain selain Heroku. Melakukan reset akan menghapus konten repositori.

Untuk mengatur ulang:

  1. Instal toolbelt Heroku (yang berisi klien baris perintah) jika Anda belum melakukannya.
  2. Instal plugin heroku-repo jika Anda belum melakukannya.

    heroku plugins:install https://github.com/heroku/heroku-repo.git
    
  3. Lakukan reset, yang menghapus repositori dan membuat repositori baru yang kosong

    heroku repo:reset
    
  4. Dorong ke remote Heroku Anda seperti biasanya; itu akan memuat ulang semuanya.

rakslice
sumber
Anda mungkin perlu menginstal alat repo Heroku agar ini berfungsi. Doheroku plugins:install https://github.com/heroku/heroku-repo.git
Noah
1

Anda perlu mengubah file konfigurasi pada server jauh setelah Anda membuat repositori kosong (kosong), katakanlah

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

di sana kamu akan melihat

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

Anda akan membuat ini menjadi false to true dan saya menghapus logallrefupdates = true (tidak yakin penggunaannya!)

untuk

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

Anda dapat menguji mengikuti

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

Cabang KEPALA ini: (tidak diketahui) akan ditampilkan jika Anda tidak dapat PUSH. Jadi jika cabang KEPALA tidak tahu, Anda harus mengubah telanjang menjadi benar dan setelah push berhasil Anda dapat menggunakan kembali

git remote show origin

dan kamu akan lihat

 HEAD branch: master
krishna vimal
sumber
0

Bagi saya solusi yang bekerja adalah:

ON REMOTE:

git checkout -b some_tmp_name

TENTANG LOKAL:

git push

ON REMOTE:

git checkout master
git branch -d some_tmp_name

Tapi ini bukan solusi nyata, itu hanya solusi.

Jmarceli
sumber
Ini solusi yang valid jika Anda tidak memiliki repositori pusat.
Rick
0

Hanya untuk berjaga-jaga jika ada yang merasa berguna. Bagi saya itu adalah masalah izin server git. Saya memeriksa proyek dari awal dan mendorong file sederhana dan kemudian saya mendapat "Dorong ditolak: Dorong ke asal / master ditolak"

PbxMan
sumber
-1

Dengan Git, dua repositori biasa (non-telanjang) tidak dapat mendorong / menarik file bolak-balik secara langsung. Harus ada repositori telanjang perantara. Rupanya, itu seperti pasangan menikah yang memiliki anak, dan pasangan ini bercerai. Orang tua tidak akan berbicara satu sama lain, tetapi mereka akan berkomunikasi melalui anak itu.

Jadi, Anda memiliki satu repositori, Anda mengkloning repositori ini ke repositori kosong, dan kemudian Anda mengkloning ke repositori ketiga. Yang pertama dan yang ketiga dapat bertukar informasi melalui repositori kedua, yang telanjang. Saya kira ini masuk akal, karena Anda tidak ingin seseorang dapat memeriksa barang-barang ke dalam repositori Anda tanpa persetujuan Anda, karena itu dapat menyebabkan penggabungan konflik & sejenisnya.

Jadi, ini sebuah contoh:

Di PC, di ~ / workspace

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

Di laptop, di ~ / workspace (jangan lakukan git init, dll.)

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

// Lalu lakukan berbagai komitmen, dan dorong mereka:

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

Kemudian kembali di PC, di ~ / workspace

git pull

// Lalu lakukan berbagai komitmen, dan dorong mereka:

git push

Di laptop git pull

Dan seterusnya..

Berikut ini adalah contoh nyata yang mutlak pada satu mesin, disalin langsung dari jendela perintah, sehingga kita akan tahu bahwa tidak ada langkah yang ditinggalkan, bahwa itu benar-benar berhasil, dll:

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
Lyle Z
sumber
Ini adalah contoh dari apa yang berhasil, dan penjelasan mengapa. Tidak ada informasi yang salah di sini sama sekali, kecuali untuk komentar Anda.
Lyle Z
1
"Dengan Git, dua repositori biasa (non-telanjang) tidak dapat mendorong / menarik file bolak-balik secara langsung" - Kecuali mereka bisa.
Andrew C
Baik, kirim contoh konkret alih-alih serangan.
Lyle Z
Atau Anda bisa google itu? stackoverflow.com/questions/1764380/…
Andrew C
Respons pertama di utas situs Anda dimulai dengan, "... tetapi menurut git ready dan git wiki resmi, Anda hanya boleh mendorong ke repo telanjang.". Respons selanjutnya menyatakan, "Jika Anda ingin mencoba hanya mendorong master -> master, maka perintahnya adalah: git push origin", dan itu sama sekali tidak berfungsi, dan ada jutaan posting yang mempengaruhi hal itu. Respons terakhir dimulai dengan, "Saya akan menyarankan untuk memiliki repositori telanjang dan repo yang bekerja (non-telanjang) di server Anda.", Yang persis seperti yang saya usulkan.
Lyle Z
-3

Solusi saya (sedang digunakan)

  1. Lihat "master" di server jarak jauh
  2. Bekerja secara lokal di cabang "dev"
  3. Dorong perubahan ke dev jauh
  4. Gabungkan dev menjadi master di remote

bingo

decibel.places
sumber