Menggunakan karakter slash dalam nama cabang Git


222

Saya cukup yakin saya melihat suatu tempat dalam proyek Git yang populer cabang-cabang memiliki pola seperti "fitur / xyz".

Namun ketika saya mencoba membuat cabang dengan karakter garis miring, saya mendapatkan kesalahan:

$ git branch labs/feature
error: unable to resolve reference refs/heads/labs/feature: Not a directory
fatal: Failed to lock ref for update: Not a directory

Masalah yang sama untuk (upaya awal saya):

$ git checkout -b labs/feature

Bagaimana cara membuat cabang di Git dengan karakter garis miring?

git  branch 

1
Sebenarnya sepertinya Anda memiliki masalah dengan HEAD. Sepertinya git berpikir Anda HEADadalah tautan ke cabang labs/featureyang belum dibuat. Saya tidak tahu bagaimana ini bisa terjadi, tetapi itu berarti bahwa upaya Anda untuk membuat cabang dipanggil foo/barberdasarkan itu, itu tidak berfungsi. Tahu bagaimana Anda bisa HEADberhenti?
CB Bailey

Saya minta maaf atas kebingungan, "labs / fitur", bukan "foo / bar", contoh diedit.

FWIW apa pun sebelum slash akan menghasilkan direktori di bawah .git/refs/headsyaitu jika Anda melakukannya git checkout -b feature/123di dalam projectRootFolder/.git/refs/headsdirektori Anda, Anda akan melihat direktori bernama: di featuremana di dalam direktori itu Anda akan melihat cabang bernama 123. Nanti jika Anda membuat yang lain feature/124di dalam featuredirektori, Anda akan melihat cabang bernama124
Honey

:-D "Sebenarnya sepertinya Anda memiliki masalah dengan HEAD" Nice one @CBBailey
Kent Bull

Jawaban:


222

Apakah Anda yakin cabang labsbelum ada (seperti di utas ini )?

Anda tidak dapat memiliki file, dan direktori dengan nama yang sama.

Anda mencoba membuat git melakukan hal ini pada dasarnya:

% cd .git/refs/heads
% ls -l
total 0
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 labs
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 master
% mkdir labs
mkdir: cannot create directory 'labs': File exists

Anda mendapatkan kesalahan yang setara dengan kesalahan "tidak dapat membuat direktori".
Ketika Anda memiliki cabang dengan garis miring di dalamnya, itu akan disimpan sebagai hierarki direktori di bawah .git/refs/heads.


3
Terima kasih atas balasan yang mendalam .. Interstingly saya mencoba git branch foo / bar (yang berfungsi); lalu git branch -d foo / bar, tapi saya melihat bahwa direktori foo / (sekarang kosong) masih ada! Sunting: dan itu diganti segera setelah saya melakukan "git branch foo". Semuanya baik-baik saja.

1
@faB: jahat ... tetapi tidak terduga: Anda menghapus bilah (di ' foo' namespace), tetapi tidak foo(yang bisa berfungsi sebagai namespace untuk cabang lain atau menjadi cabang itu sendiri)
VonC

Ini tidak terlalu penting, tetapi git tidak mengubah pendiriannya bahkan ketika Anda menelepon pack-refs, jadi itu akan menghalangi Anda untuk melindungi Anda dari ini.
Josh Lee

23
Untuk meringkas jawabannya: Anda dapat memiliki garis miring pada nama cabang. OP sudah memiliki labscabang dan mencoba membuat labs/feature, yang ditolak git.
duozmo

107

Dimungkinkan untuk memiliki nama cabang hierarkis (nama cabang dengan garis miring). Sebagai contoh di repositori saya, saya memiliki cabang seperti itu. Satu peringatan adalah bahwa Anda tidak dapat memiliki kedua cabang 'foo' dan cabang 'foo / bar' di repositori.

Masalah Anda bukan dengan membuat cabang dengan nama slash.

foo / bar cabang $ git
kesalahan: tidak dapat menyelesaikan referensi referensi / kepala / laboratorium / fitur: Bukan direktori
fatal: Gagal mengunci ref untuk pembaruan: Bukan direktori

Pesan kesalahan di atas berbicara tentang 'labs / fitur' cabang, bukan 'foo / bar' (kecuali itu adalah kesalahan dalam copy'n'paste, yaitu Anda mengedit bagian sesi). Apa hasil dari git branchatau git rev-parse --symbolic-full-name HEAD?


1
Terima kasih, maaf tentang kebingungan, saya pertama kali menulis contoh foo / bar, tetapi tempel pesan kesalahan dari pengujian saya yang sebenarnya. Tidak akan melakukannya lagi :) Dan maaf juga atas kesalahan saya, memang saya sudah memiliki cabang "laboratorium".

33

Terkadang masalah itu terjadi jika Anda sudah memiliki cabang dengan nama dasar.

Saya mencoba ini:

git checkout -b features/aName origin/features/aName

Sayangnya, saya sudah memiliki cabang bernama features, dan saya mendapat pengecualian dari penanya pertanyaan.

Menghapus cabang featuresmenyelesaikan masalah, perintah di atas berhasil.


32

Dalam kasus saya, saya lupa bahwa sudah ada labscabang yang tidak digunakan . Menghapusnya memecahkan masalah:

git branch -d labs
git checkout -b labs/feature

Penjelasan:

Setiap nama hanya bisa menjadi cabang induk atau cabang normal, bukan keduanya. Itu sebabnya cabang labs dan labs/feature tidak bisa ada keduanya pada saat yang sama.

Alasan untuk perilaku ini adalah bahwa cabang disimpan dalam sistem file dan di sana Anda juga tidak dapat memiliki file labsdan direktori labspada tingkat yang sama.


-1

Saya bisa saja salah, tetapi saya berpikir bahwa garis miring hanya muncul dalam nama cabang ketika terkait dengan repo jarak jauh, misalnya origin/master.


11
Sangat mungkin - dan memang umum - untuk membuat cabang lokal dengan '/' dalam nama mereka. Ini adalah cara umum pengelompokan cabang terkait dalam 'namespace'.
CB Bailey

Ya jujur ​​yang bisa membingungkan saat belajar, tetapi penamaan bisa berguna juga. Kemudian lagi menggunakan garis miring, saya tidak yakin apakah itu penting di luar selera pribadi?

2
git flow menggunakan gaya namespacing ini :)
Rimian
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.