Git: Cara yang benar untuk mengubah Cabang Aktif di repositori kosong?

195

Saya memiliki repositori kosong yang digunakan sebagai pusat toko untuk proyek saya. Semua pengembang lakukan git clone <repo>untuk berbagi dengannya. Ketika mereka melakukan kloning, mereka mendapatkan checkout dari cabang master (kecuali jika mereka melakukannya git clone -n) karena repo.git/HEADmengandung ref: refs/heads/master, menjadikan ini Cabang Aktif .

Pertanyaannya adalah, bagaimana cara mengubah Cabang Aktif dengan benar? Saya hanya bisa meretas repo.git/HEADfile secara langsung, tetapi itu tampak tidak menyenangkan dan, well, hacky.

Saya mencoba melakukan git checkout <otherbranch>di .gitdirektori repo , tetapi gagal karena saya tidak berada di pohon kerja.

Saya mencoba git update-ref HEAD refs/heads/otherbranchtetapi yang baru saja memperbarui referensi / kepala / master harus sama dengan referensi / kepala / cabang lainnya (oke, saya melakukan itu di repositori dummy, bukan produksi saya!)

Saya mencoba git update-ref --no-deref HEAD refs/heads/otherbranchdan itu hampir berhasil. Itu memperbarui HEADfile, tetapi mengaturnya ke SHA1 dari komit yang ditunjuk oleh refs/heads/otherbranch.

Saya sedang menguji dengan versi git 1.7.0.2.msysgit.0.

Saya kira tidak ada cara untuk melakukan ini git push, karena memungkinkan semua orang untuk mengubah cabang default Anda tampaknya sedikit tidak aman (!), Tapi pasti ada cara yang lebih baik untuk melakukannya di .gitdirektori repo daripada langsung meretas HEADfile.

kbro
sumber
IMO Anda hanya mencoba melakukan The Wrong Thing secara fundamental di sini. Jika Anda ingin cabang default menjadi sesuatu selain master, maka cabang itu haruslah master. Atau, gunakan dua repositori yang berbeda.
Nicholas Knight
12
Bagaimana ini secara mendasar mencoba melakukan hal yang salah di sini? Repositori kosong mendukung banyak cabang. Saya menggunakan repositori kosong sebagai cadangan untuk repositori lokal saya, dan dengan demikian mencerminkan cabang. Saya memiliki master di keduanya dan cabang pengembangan di keduanya. Jika saya ingin melihat log cabang pengembangan pada repositori kosong, saya harus meretas file - sepertinya git pada dasarnya salah di sini sehubungan dengan dukungan repositori kosong.
Cthutu
15
@NicholasKnight IMHO Anda pada dasarnya salah di sini. Tidak ada yang istimewa tentang "master" sebagai nama cabang, itu hanya default. Dalam respositoria yang mengelola, kami tidak memiliki cabang utama, karena "master" tidak berarti bagi perusahaan. Setiap kali kami melakukan rilis, kami membuat cabang pemeliharaan baru dengan nomor rilis baru, dan menetapkannya sebagai cabang aktif.
Spacemoose
@NicholasKnight Sementara saya menghargai dari mana Anda berasal, ini adalah SO T / A pertama yang memberi tahu saya cara beralih ke master! Saya memiliki repo awal saya pada cabang fitur ketika saya membuat klon telanjang saya, dan klon berikutnya dari repo telanjang itu default ke cabang itu daripada master.
Warbo
1
Wow - pertanyaan ini hanya berjalan dan berjalan - ini adalah pencetak poin reputasi nomor 1 saya! Hal tentang "master" adalah bahwa itu hanya sebuah nama, dan jika itu tidak masuk akal untuk organisasi Anda, tim, proyek, fase, apa pun, lalu pilih sesuatu yang sesuai sehingga ketika Anda kolaborator mengkloning repo Anda, mereka segera beralih ke cabang tempat Anda, sebagai Manajer Konfigurasi, ingin mereka aktif. Saya dulu bekerja dengan ClearCase (bletch!) Sehingga pilihan Anda adalah "utama", "utama" atau "utama". Yuk.
kbro

Jawaban:

279

Jika Anda memiliki akses ke repo telanjang, artikel ini menyarankan :

git symbolic-ref HEAD refs/heads/mybranch

Yang akan memperbarui file HEAD di repositori Anda sehingga berisi:

ref: refs/heads/mybranch

sebagaimana didokumentasikan dalam git-symbolic-ref


Jika Anda tidak memiliki akses ke repo jarak jauh, lihat jawaban saya sebelumnya .


Ingat bahwa perintah seperti git remote set-head:

  • tidak mengubah cabang default repo jarak jauh .
    Ini hanya mengubah cabang pelacakan jarak jauh yang disimpan di repo lokal Anda sebagairefs/remotes/<name>/HEAD

  • tidak berubah dengan HEADsendirinya (sekali lagi, hanya refs/remotes/<name>/HEAD), maka kebutuhan untuk git symbolic-ref.

Jadi git remote set-head bukan jawabannya di sini.
git symbolic-ref HEADadalah, jika Anda memiliki akses langsung ke repo jarak jauh.

VONC
sumber
3
Terima kasih! Saya memang memiliki akses langsung ke repo telanjang yang terpencil sehingga git-symbolic-ref akan melakukan pekerjaan itu. Saya suka trik nenek moyang yang disebutkan di utas lainnya, - pasti satu untuk laci bawah. Saya menghabiskan banyak waktu mencari Googling untuk ini tetapi tidak dapat menemukan jawaban Anda sebelumnya, namun "git remote head master" menemukannya sebagai hit peringkat tertinggi kedua, tepat di bawah git-remote (1). Aneh. Cukup tunjukkan betapa sulitnya menemukan sesuatu ketika Anda tidak tahu persis apa yang Anda cari.
kbro
git symbolic-ref HEAD refs/heads/mybranchbekerja dengan baik untukku! TERIMA KASIH! ;)
vinzenzweber
1
Saya sangat menghargai pertanyaan ini, karena saya secara tidak sengaja memeriksa cabang yang berbeda dari master dan sekarang saya harus memperbaikinya.
Jonny Best
Ini tidak berhasil untuk saya. Anehnya, walaupun HEAD jarak jauh di bare repo sekarang menunjukkan cabang yang benar, git MASIH default saya ke cabang yang berbeda ketika saya mengkloning dari itu!
Magnus
@ Magnus itu akan menjadi pertanyaan bagus untuk ditanyakan di halaman baru.
VonC
3

Untuk mengubah cabang, Anda perlu mengubah referensi HEAD ke cabang yang ingin Anda gunakan.

Pertama, daftarkan semua referensi di repositori kosong dengan melakukan

$find ref

Kemudian temukan referensi untuk cabang Anda, formatnya adalah sebagai berikut refs/heads/<my_branch>. Jadi langkah selanjutnya adalah memeriksa referensi saat ini, cukup ketik:

$git symbolic-ref HEAD

sehingga Anda tahu mana cabang saat ini kemudian perbarui sesuai kebutuhan.

$git sumbolic-ref HEAD ref/heads/<my_branch>

Itu dia. Nikmati.

Saul Rosales
sumber
2

Bagaimana cara mengubah Cabang Aktif dengan benar?

  • status: git checkout di direktori repo. git mengembalikan fatal: Operasi ini harus dijalankan di pohon kerja

  • tips: cukup tambahkan argumen --work-tree

contoh terperinci: asumsi: bare git di server jauh:

~ / bare_git_repository.git pohon kerja terpisah: / var / www / myappremote

di server lokal: buat cabang versi.1.7 (cabang lainnya kami)

git branch versi.1.7

git push origin versi.1.7

di server jauh dengan git bare repo:

$ cd ~ / bare_git_repository.git

cabang $ git

  • Master
    version.1.7

Sebagaimana dinyatakan, mengikuti perintah

git checkout versi.1.7

kembali

fatal: Operasi ini harus dijalankan di pohon kerja

Menggunakan perintah berikut

git --work-tree = / var / www / myappremote checkout version.1.7

berhasil mengubah Cabang Aktif dengan benar

cabang $ git

menguasai

  • versi.1.7

periksa hasilnya dengan berikut ini

ll / var / www / myappremote

Semoga ini bisa membantu

c-tools
sumber
Solusi yang sangat sederhana ini berhasil untuk saya, terima kasih! Satu catatan: Saya harus membuat direktori work-tree kosong dengan tangan agar perintah berhasil dijalankan.
Joël Esponde
-1

Juga, jika Anda tidak memiliki akses ke repositori kosong, dengan melakukan git remote set-headdan Anda selesai

Lihat respons sebelumnya ini

dvdvck
sumber
-3

Saya juga punya repo kosong di server kami dan berhasil mengambil file menggunakan

git clone //server/repo/directory -b branch_name

ke dalam repositori lokal baru meskipun halaman manual mengatakan ini hanya untuk repositori non-telanjang.

mcjh
sumber
1
Sementara apa yang Anda katakan itu benar, fakta bahwa Anda menggunakan -b untuk memilih cabang tertentu mematahkan jawaban Anda dalam konteks pertanyaan saya, yaitu bagaimana Anda mengatur cabang DEFAULT.
kbro
-4

Saya membandingkan dua direktori sebelum dan sesudah mendaftar

git symbolic-ref HEAD refs/heads/mybranch

dan tampaknya hanya file repo.git / HEAD yang diubah jadi mungkin cukup aman untuk "meretas" file tersebut.

Boryn
sumber
2
Ada masalah pemecahan halus yang dapat diperkenalkan dengan langsung mengedit file Git ref. Saya sangat merekomendasikan hal itu. Perintah plumbing lebih mudah dan lebih aman daripada mengedit referensi secara langsung.
Alain O'Dea
2
Apa kelebihan @boryn ini?
Alex Chamberlain
2
Git melacak banyak hal di latar belakang seperti riwayat referensi. Jika Anda mengubah file secara manual maka itu tidak akan dicatat. Memang benar bahwa itu mungkin tidak masalah. Tetapi jika Anda kehilangan jejak beberapa komitmen dan ingin menemukannya, Anda akan lebih bahagia jika Anda tidak hanya "meretas" file tersebut.
qwerty9967
Saya menggunakan perintah. Tetapi jawaban ini sangat membantu untuk memahami cara kerjanya, dan, pada bagian tertentu, untuk memahami bahwa referensi / kepala adalah sesuatu yang internal dan saya tidak boleh mengubahnya, hanya bagian terakhir dari "jalan". Jadi, saya memilih karena saya pikir itu informasi yang berharga.
Mike Keskinov