Bagaimana cara memperbarui repo telanjang saya?

134

Saya membuat repo telanjang, untuk mempublikasikan repositori saya, tetapi saya tidak tahu cara memperbarui repo telanjang dengan keadaan repositori utama saat ini.

Šimon Tóth
sumber
2
Lihat jawaban ini: stackoverflow.com/questions/315911/…
Ken Bloom

Jawaban:

83

Jika Anda ingin menduplikasi semua objek dari repo utama, lakukan ini di dalam repo utama:

git push --all <url-of-bare-repo>

Atau, lakukan pengambilan di dalam repo telanjang:

git fetch <url-of-main-repo>

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:

git remote add <whatever-name> <url-of-other-repo>

Maka Anda bisa melakukannya

git push --all <whatever-name>

atau

git fetch <whatever-name>

tergantung pada apa repo Anda berada di. Jika <whatever-name>adalah origin, Anda bahkan dapat meninggalkan keluar sama sekali.

Penafian: Saya bukan guru git. Jika saya mengatakan sesuatu yang salah, saya ingin tercerahkan!

Perbarui: Baca komentar!

Thomas
sumber
7
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:

git fetch --all

Saya menemukan solusi ini dengan membaca Mirror a Git Repository By Pulling

austen
sumber
22
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 :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

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.

Colin D Bennett
sumber
1
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.
Elliott Slaughter
46

Asumsi:

$ git clone --bare https://github.com/.../foo.git

Ambil dengan:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

Catatan: --git-dir=foo.gittidak diperlukan jika Anda cdke direktori terlebih dahulu.

antak
sumber
2
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.

Sekali:

git clone --mirror ssh://[email protected]:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

Setiap kali saya ingin menyinkronkan:

cd /home/myhome/repo.git
git --bare fetch ssh://[email protected]:2000/repo
git  fetch ssh://[email protected]:2000/repo
git push --mirror remote_site
simonvc
sumber
7
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.

Philipp
sumber
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)
fanf42
0

Bagi saya kombinasi ini berhasil:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

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 )

Alexander Samoylov
sumber