Bagaimana cara mendorong repositori non-telanjang Git?

150

Saya biasanya bekerja di server jauh melalui ssh (layar dan vim), di mana saya memiliki repositori Git. Terkadang saya tidak online, jadi saya memiliki repositori terpisah (dikloning dari remote saya) di laptop saya.

Namun, saya tidak dapat menarik dari repositori ini di sisi yang jauh karena saya biasanya di belakang firewall atau saya tidak memiliki IP publik.

Saya telah membaca bahwa saya harus mendorong hanya ke repositori kosong. Lalu bagaimana saya harus mendorong perubahan saya ke repositori jarak jauh saya?

woky
sumber
3
memiliki 2 repo jarak jauh, yang telanjang dan normal, dan menggunakan kait. sepertinya merepotkan, tetapi menurut git ready dan git wiki resmi , Anda hanya perlu mendorong ke repo kosong . ini mungkin mengapa sebagian besar host git repo (misalnya GitHub, Bitbucket) menyertakan kait pasca-terima, sehingga Anda dapat POST ke URL di server Anda yang menjalankan skrip yang mengeksekusi misalnya git pull github master.
Jake Berger

Jawaban:

137

receive.denyCurrentBranch updateInstead

Opsi ini ditambahkan di Git 2.3 , dan itu membuat server memperbarui pohon kerjanya jika bersih.

Jadi, jika Anda memastikan bahwa Anda selalu melakukan sebelum menarik secara lokal, dan menjaga pohon kerja yang bersih di server (yang harus Anda lakukan untuk menghindari konflik penggabungan), maka opsi ini adalah solusi yang baik.

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
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
apakah mungkin untuk mendorong tanpa membuat repo kosong seperti yang dilakukan heroku
ANinJa
2
@ ANJJA Saya tidak mengerti, bukankah itu persis seperti contoh saya?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
itu --localopsional?
Yukulélé
@ Yukulélé --localhanya memengaruhi direktori saat ini, --globalmemengaruhi semua repositori git dengan ~/.gitconfig, lihat man git-config.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
terima kasih @CiroSantilli 新疆 改造 中心 六四 事件 法轮功 setelah membaca dokumen, saya mengkonfirmasi bahwa itu tidak perlu "(Anda dapat mengatakan --lokal tapi itu standar)"
Yukulélé
146

Opsi terbaik

Mungkin cara paling bersih, paling membingungkan, dan paling aman untuk mendorong ke repositori jarak jauh non-telanjang Anda, adalah mendorong ke cabang khusus di remote yang mewakili cabang laptop Anda.

Mari kita lihat kasus paling sederhana, dan anggap Anda hanya memiliki satu cabang di setiap repo: master. Saat Anda mendorong repo jarak jauh dari laptop Anda, alih-alih mendorong master -> master, push master -> laptop-master (atau nama yang serupa). Dengan cara ini, push tidak mempengaruhi cabang master yang saat ini sedang diperiksa di repo jarak jauh. Untuk melakukan ini dari laptop, perintahnya cukup sederhana:

git push origin master:laptop-master

Ini berarti bahwa cabang master lokal akan didorong ke cabang bernama "laptop-master" di repositori jarak jauh. Di repo jarak jauh Anda, Anda akan memiliki cabang baru bernama "laptop-master" yang kemudian dapat Anda gabungkan menjadi master jarak jauh saat Anda siap.

Opsi Alternatif

Mungkin juga untuk hanya mendorong master -> master, tetapi mendorong ke cabang repo non-telanjang yang saat ini check-out umumnya tidak disarankan, karena dapat membingungkan jika Anda tidak mengerti apa yang sedang terjadi. Ini karena mendorong ke cabang check-out tidak memperbarui pohon kerja, jadi memeriksa git statusdi cabang check-out yang didorong ke dalam akan menunjukkan perbedaan yang berlawanan persis seperti apa yang baru-baru ini didorong. Terutama akan membingungkan jika pohon kerja kotor sebelum dorongan itu dilakukan, yang merupakan alasan besar mengapa ini tidak dianjurkan.

Jika Anda ingin mencoba hanya mendorong master -> master, maka perintahnya adalah:

git push origin

Tetapi ketika Anda kembali ke repo jarak jauh, kemungkinan besar Anda ingin melakukan suatu git reset --hard HEADuntuk menyinkronkan pohon kerja dengan konten yang didorong. Ini bisa berbahaya , karena jika ada perubahan yang tidak dikomit di pohon kerja jarak jauh yang Anda ingin simpan akan menghapusnya. Pastikan Anda tahu apa konsekuensi dari ini sebelum Anda mencobanya, atau setidaknya buat cadangan terlebih dahulu!

EDIT Sejak Git 2.3, Anda dapat menggunakan "push-to-deploy" git push: https://github.com/blog/1957-git-2-3-has-been-released . Tetapi mendorong ke cabang terpisah dan kemudian menggabungkan biasanya lebih baik karena melakukan penggabungan aktual (karenanya bekerja dengan perubahan yang tidak dikomit seperti halnya penggabungan).

Dan Moulding
sumber
1
Apakah mungkin untuk mengotomatisasi percabangan setelah mendorong laptop-master?
rdoubleui
3
@rdoubleui: Apakah maksud Anda "mengotomatiskan penggabungan "? Jika demikian, tidak, itu tidak mungkin untuk mengotomatiskan penggabungan karena penggabungan tidak dijamin menjadi mungkin tanpa campur tangan manusia. Mungkin ada konflik yang perlu diselesaikan.
Dan Moulding
7
di versi yang lebih baru (?), git config receive.denyCurrentBranch ignore harus dilakukan sebelum mendorong ke repo non-telanjang
prusswan
3
Jawaban yang bagus @DanMoulding, terima kasih. @rdoubleui: Anda selalu dapat menyimpan baris perintah seperti berikut sebagai fungsi bash:git push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
Rich
@rdoubleui untuk mengotomatiskan penggabungan, Anda dapat menggunakan gitolite dan mengaturnya (sedikit rumit) untuk membuat non-telanjang melakukan semuanya kotor dan mendorongnya ke versi gitolite (telanjang) menggunakan pemicu pre-git. Setelah itu jika penggabungan tidak dapat diselesaikan dalam non-telanjang, itu akan menolak dorongan Anda, sehingga Anda tahu Anda harus menarik dulu, menyelesaikan penggabungan dan mendorong lagi. Saya belum mengatur ini, tetapi saya sedang dalam proses dan berpikir itu bisa berhasil.
17

Saya menyarankan untuk memiliki repositori telanjang dan repositori lokal yang berfungsi (non-telanjang) di server Anda. Anda dapat mendorong perubahan dari laptop ke repo bare server dan kemudian menarik dari repo telanjang ke repo yang berfungsi server. Alasan saya mengatakan ini adalah karena Anda mungkin memiliki banyak cabang lengkap / tidak lengkap di server yang ingin Anda tiru pada laptop.

Dengan cara ini Anda tidak perlu khawatir tentang keadaan cabang memeriksa server repo yang bekerja sambil mendorong perubahan ke server.

Manish
sumber
4

Pilihan lain adalah mengatur terowongan ssh terbalik sehingga Anda dapat menarik alih-alih mendorong.

# start the tunnel from the natted box you wish to pull from (local)
$ ssh -R 1234:localhost:22 user@remote

# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side

Dan jika Anda ingin terowongan berjalan di latar belakang

$ ssh -fNnR 1234:localhost:22 user@remote
Todd Freed
sumber
1

Anda dapat melakukan:

$git config --bool core.bare true

ini dapat dilakukan dalam repositori telanjang atau sentral sehingga akan menerima file apa pun yang didorong dari repositori non telanjang. Jika Anda melakukan ini di repositori non telanjang maka kami tidak dapat mendorong file dari repositori non telanjang ke telanjang.

Jika Anda mempraktikkan GIT dengan membuat repo sentral dan non-telanjang di PC, ia mungkin tidak menampilkan file yang didorong di beberapa PC tetapi telah didorong. Anda dapat memeriksanya dengan menjalankan.

$git log di repo pusat.

Selain jika Anda menekan ke GitHub itu akan menampilkan file di sana.

vidwan reddy
sumber