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?


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

VONC
sumber
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?

Jakub Narębski
sumber
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.

elbkind
sumber
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.

flori
sumber
-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.

crazyscot
sumber
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