Saya membuat repo telanjang, untuk mempublikasikan repositori saya, tetapi saya tidak tahu cara memperbarui repo telanjang dengan keadaan repositori utama saat ini.
Ketika saya melakukan git-fetch --alldi dalam repositori telanjang, saya tidak melihat pembaruan yang telah saya buat untuk repo utama, tetapi ketika mendorong mereka dari repo utama dengan git push --all <url-of-bare-repo>saya melihat pembaruan di git log. Mungkin ada penjelasan sederhana untuk ini - dapatkah seseorang menjelaskan?
pho79
2
@ Thomas - Ya, oleh "tidak melihat" Maksud saya git logtidak menunjukkan pembaruan ini di repo telanjang. (Tidak juga git log --all, dan repo yang berfungsi yang dibuat dengan mengkloning repo telanjang - baik melalui git log --allatau hanya dengan melihat file baru yang akan ditampilkan di sana). Ini tes yang cukup cepat untuk dilihat sendiri. Kebanyakan saya hanya ingin tahu apa yang saya lewatkan.
pho79
71
Jika repo jarak jauh Anda adalah sesuatu seperti github, di mana Anda tidak memiliki akses, tidak dapat menjalankan push, dll, Anda dapat melakukannya git fetch -q origin master:masterdi dalam repo telanjang lokal Anda. Ini akan mengambil barang baru dari cabang utama github dan memperbarui cabang master lokal Anda ke sana.
Altreus
4
@Altreus Memang master:masterapa yang diperlukan untuk memajukan HEAD ke repo jarak jauh. Dalam kasus saya karena masalah, saya tidak bisa lagi terhubung ke repo telanjang kami karena git hilang. Sampai selesai, saya membuat terowongan terbalik dan mengambil repo pusat menggunakan: git fetch ssh://localhost:8765/... master:masterdan itu berfungsi seperti pesona. Terima kasih!
estani
3
@Altreus Jika Anda ingin semua cabang maka Anda dapat melakukannyagit fetch origin *:*
JBert
71
Saya membuat repositori menggunakan perintah berikut
git clone --bare <remote_repo>
Kemudian saya mencoba memperbarui klon telanjang menggunakan jawaban oleh Thomas, tetapi itu tidak berhasil bagi saya. Untuk mendapatkan repositori kosong yang diperbarui (yang menurut saya diminta oleh Let_Me_Be), saya harus membuat repositori mirror:
git clone --mirror <remote_repo>
Kemudian saya bisa menjalankan perintah berikut di repositori mirrored untuk mengambil pembaruan repositori utama:
Untuk mengubah repo kosong ke mirror, yang perlu Anda lakukan adalah menambahkan 2 baris ke file git config di <REPO> .git / config. Di [remote "origin"]bagian ini, tambahkan fetch = +refs/*:refs/*danmirror = true
Isaac Betesh
@IsaacBetesh Kamu menyelamatkan hariku :)
smc
54
Satu-satunya solusi selain membuat ulang git clone --mirroradalah dari Gregor :
maka Anda bisa git fetchdan Anda akan melihat pembaruan. Yang aneh adalah bahwa sebelum ini, meskipun ada yang remotedikonfigurasi, tidak memiliki cabang yang terdaftar di git branch -a.
Ini sangat membantu saya! Proyek / repo Capistrano juga menggunakan pengaturan ini untuk memungkinkan one-liner git remote updatemelakukan pekerjaan.
Minqi Pan
1
Jika remote memiliki cabang yang diperbarui atau dihapus secara paksa (dan Anda ingin mencerminkan perubahan itu), Anda mungkin perlu menambahkan --forcedan --prunemasing - masing ke git fetchbaris.
Meskipun saya tidak mengetahui kapan itu terjadi, jika origintidak didefinisikan, Anda selalu dapat mengganti originbagian dengan path / url ke repositori asli Anda. mis$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak
Ini persis apa yang saya cari. Ini bekerja dengan sempurna.
Maxime Rouiller
13
Setelah banyak bermain-main, saya menemukan bahwa ini bekerja untuk saya.
Baris ketiga ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') adalah kuncinya. Jawaban yang bagus, terima kasih!
peterh
2
Seperti yang dikatakan @peterh, barisnya git config remote.origin.fetch 'refs/heads/*:refs/heads/*'adalah jawabannya. Setelah menekan perintah ini, saya bisa git fetchdan repo sinkronisasi dengan yang jauh.
Joker
3
Tambahkan repositori kosong sebagai repositori jarak jauh, lalu gunakan git push.
Jadi jika saya ingin melakukan ini tanpa mendorong saya tidak dapat menggunakan repositori telanjang dan menggunakan tautan simbolis atau sesuatu seperti itu?
Šimon Tóth
Mendorong adalah metode normal untuk mentransfer konten repositori ke repositori kosong, tidak perlu menghindarinya.
Philipp
2
Anda tidak bisa selalu mendorong. Misalnya, jika telanjang di jaringan pribadi, dan repo utama adalah yang publik (di GitHub, misalnya)
Parameter -u untuk pengambilan diperlukan, jika tidak, saya mendapatkan pesan kesalahan: "Menolak untuk mengambil referensi cabang / kepala / master repositori non-telanjang saat ini" (lihat juga https://stackoverflow.com/a/19205680/4807875 )
Jawaban:
Jika Anda ingin menduplikasi semua objek dari repo utama, lakukan ini di dalam repo utama:
Atau, lakukan pengambilan di dalam repo telanjang:
Anda tidak dapat melakukan tarikan, karena tarikan ingin digabung dengan
HEAD
, yang tidak dimiliki repo telanjang.Anda dapat menambahkan ini sebagai remote untuk menghemat beberapa pengetikan di masa mendatang:
Maka Anda bisa melakukannya
atau
tergantung pada apa repo Anda berada di. Jika
<whatever-name>
adalahorigin
, Anda bahkan dapat meninggalkan keluar sama sekali.Penafian: Saya bukan guru git. Jika saya mengatakan sesuatu yang salah, saya ingin tercerahkan!
Perbarui: Baca komentar!
sumber
git-fetch --all
di dalam repositori telanjang, saya tidak melihat pembaruan yang telah saya buat untuk repo utama, tetapi ketika mendorong mereka dari repo utama dengangit push --all <url-of-bare-repo>
saya melihat pembaruan digit log
. Mungkin ada penjelasan sederhana untuk ini - dapatkah seseorang menjelaskan?git log
tidak menunjukkan pembaruan ini di repo telanjang. (Tidak jugagit log --all
, dan repo yang berfungsi yang dibuat dengan mengkloning repo telanjang - baik melaluigit log --all
atau hanya dengan melihat file baru yang akan ditampilkan di sana). Ini tes yang cukup cepat untuk dilihat sendiri. Kebanyakan saya hanya ingin tahu apa yang saya lewatkan.git fetch -q origin master:master
di dalam repo telanjang lokal Anda. Ini akan mengambil barang baru dari cabang utama github dan memperbarui cabang master lokal Anda ke sana.master:master
apa yang diperlukan untuk memajukan HEAD ke repo jarak jauh. Dalam kasus saya karena masalah, saya tidak bisa lagi terhubung ke repo telanjang kami karena git hilang. Sampai selesai, saya membuat terowongan terbalik dan mengambil repo pusat menggunakan:git fetch ssh://localhost:8765/... master:master
dan itu berfungsi seperti pesona. Terima kasih!git fetch origin *:*
Saya membuat repositori menggunakan perintah berikut
git clone --bare <remote_repo>
Kemudian saya mencoba memperbarui klon telanjang menggunakan jawaban oleh Thomas, tetapi itu tidak berhasil bagi saya. Untuk mendapatkan repositori kosong yang diperbarui (yang menurut saya diminta oleh Let_Me_Be), saya harus membuat repositori mirror:
Kemudian saya bisa menjalankan perintah berikut di repositori mirrored untuk mengambil pembaruan repositori utama:
Saya menemukan solusi ini dengan membaca Mirror a Git Repository By Pulling
sumber
[remote "origin"]
bagian ini, tambahkanfetch = +refs/*:refs/*
danmirror = true
Satu-satunya solusi selain membuat ulang
git clone --mirror
adalah dari Gregor :maka Anda bisa
git fetch
dan Anda akan melihat pembaruan. Yang aneh adalah bahwa sebelum ini, meskipun ada yangremote
dikonfigurasi, tidak memiliki cabang yang terdaftar digit branch -a
.sumber
git remote update
melakukan pekerjaan.--force
dan--prune
masing - masing kegit fetch
baris.Asumsi:
Ambil dengan:
Catatan:
--git-dir=foo.git
tidak diperlukan jika Andacd
ke direktori terlebih dahulu.sumber
origin
tidak didefinisikan, Anda selalu dapat menggantiorigin
bagian dengan path / url ke repositori asli Anda. mis$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
Setelah banyak bermain-main, saya menemukan bahwa ini bekerja untuk saya.
Sekali:
Setiap kali saya ingin menyinkronkan:
sumber
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'
) adalah kuncinya. Jawaban yang bagus, terima kasih!git config remote.origin.fetch 'refs/heads/*:refs/heads/*'
adalah jawabannya. Setelah menekan perintah ini, saya bisagit fetch
dan repo sinkronisasi dengan yang jauh.Tambahkan repositori kosong sebagai repositori jarak jauh, lalu gunakan
git push
.sumber
Bagi saya kombinasi ini berhasil:
Parameter -u untuk pengambilan diperlukan, jika tidak, saya mendapatkan pesan kesalahan: "Menolak untuk mengambil referensi cabang / kepala / master repositori non-telanjang saat ini" (lihat juga https://stackoverflow.com/a/19205680/4807875 )
sumber