การใช้อักขระทับในชื่อสาขา Git


222

ฉันค่อนข้างแน่ใจว่าฉันเห็นที่ไหนสักแห่งในโครงการ Git ยอดนิยมสาขามีรูปแบบเช่น "feature / xyz"

อย่างไรก็ตามเมื่อฉันพยายามสร้างสาขาด้วยอักขระทับฉันได้รับข้อผิดพลาด:

$ 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

ปัญหาเดียวกันสำหรับ (ความพยายามครั้งแรกของฉัน):

$ git checkout -b labs/feature

เราจะสร้างสาขาใน Git ด้วยอักขระทับได้อย่างไร

git  branch 

1
HEADจริงๆแล้วมันดูเหมือนว่าคุณมีปัญหากับคุณ ดูเหมือนว่าคอมไพล์คิดว่าHEADลิงก์ของคุณไปยังสาขาlabs/featureที่ยังไม่ได้สร้าง ฉันไม่รู้ว่ามันจะเกิดขึ้นได้อย่างไร แต่หมายความว่าคุณพยายามสร้างสาขาที่เรียกว่าเป็นสาขาfoo/barแต่มันไม่ทำงาน คุณมีความคิดยังไงHEADบ้าง
CB Bailey

ฉันขอโทษสำหรับความสับสน "แล็บ / ฟีเจอร์" ของมันไม่ใช่ "foo / bar" ตัวอย่างที่แก้ไข

FWIW อะไรก่อนเฉือนจะสร้างไดเรกทอรีภายใต้.git/refs/headsเช่นถ้าคุณทำgit checkout -b feature/123แล้วภายในของคุณprojectRootFolder/.git/refs/headsไดเรกทอรีคุณจะเห็นไดเรกทอรีชื่อ: ที่อยู่ภายในไดเรกทอรีที่คุณจะเห็นสาขาที่มีชื่อว่าfeature 123ในภายหลังหากคุณสร้างขึ้นใหม่feature/124จากนั้นในfeatureไดเรกทอรีคุณจะเห็นสาขาชื่อ124
ฮันนี่

:-D "จริง ๆ แล้วดูเหมือนว่าคุณมีปัญหากับHEAD" Nice one @CBBailey
Kent Bull

คำตอบ:


222

คุณแน่ใจหรือว่าสาขาlabsไม่มีอยู่ (ในหัวข้อนี้ )?

คุณไม่สามารถมีทั้งไฟล์และไดเรกทอรีที่มีชื่อเดียวกัน

คุณกำลังพยายามทำให้คอมไพล์ทำสิ่งนี้โดยพื้นฐาน:

% 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

คุณได้รับข้อผิดพลาด "ไม่สามารถสร้างไดเรกทอรี" เทียบเท่า เมื่อคุณมีสาขาที่มีเครื่องหมายทับในนั้นจะได้รับการเก็บไว้เป็นลำดับชั้นไดเรกทอรีภายใต้
.git/refs/heads


3
ขอบคุณสำหรับการตอบกลับในเชิงลึก .. Interstingly ฉันลอง git branch foo / bar (ที่ใช้งานได้); จากนั้น git branch -d foo / bar แต่ฉันเห็นว่า foo / directory (ว่างเปล่า) ยังคงมีอยู่! แก้ไข: และมันจะถูกแทนที่ทันทีที่ฉันทำ "git branch foo" ทั้งหมดเป็นอย่างดี.

1
@faB: ชั่วร้าย ... แต่ไม่คาดคิด: คุณลบแถบ (ใน ' foo' namespace) แต่ไม่ใช่foo(ซึ่งอาจทำหน้าที่เป็น namespace สำหรับสาขาอื่นหรือเป็นสาขาเอง)
VonC

สิ่งนี้ไม่สำคัญเลย แต่คอมไพล์ไม่เปลี่ยนท่าทางแม้เมื่อคุณโทรpack-refsดังนั้นมันจึงออกนอกเส้นทางเพื่อปกป้องคุณจากสิ่งนี้
Josh Lee

23
เพื่อสรุปคำตอบ: คุณสามารถมีเครื่องหมายทับในชื่อสาขา OP มีlabsสาขาแล้วและพยายามที่จะสร้างlabs/featureซึ่งคอมไพล์ balked ที่
duozmo

107

เป็นไปได้ที่จะมีชื่อสาขาแบบลำดับขั้น (ชื่อสาขาที่มีเครื่องหมายทับ) ตัวอย่างเช่นในที่เก็บของฉันฉันมีสาขาดังกล่าว ข้อแม้หนึ่งคือคุณไม่สามารถมีทั้ง 'foo' และ 'foo / bar' ในที่เก็บของสาขา

ปัญหาของคุณไม่ได้เกิดจากการสร้างสาขาที่มีเครื่องหมายทับ

$ git branch foo / bar
ข้อผิดพลาด: ไม่สามารถแก้ไขการอ้างอิง refs / heads / labs / feature: ไม่ใช่ไดเรกทอรี
ร้ายแรง: ไม่สามารถล็อกการอ้างอิงสำหรับการอัปเดต: ไม่ใช่ไดเรกทอรี

ข้อความแสดงข้อผิดพลาดข้างต้นพูดถึงสาขา 'ห้องปฏิบัติการ / คุณลักษณะ' ไม่ใช่ 'foo / bar' (เว้นแต่ว่าเป็นความผิดพลาดใน copy'n'paste นั่นคือคุณได้แก้ไขส่วนต่างๆของเซสชัน) ผลการคืออะไรgit branchหรือgit rev-parse --symbolic-full-name HEAD?


1
ขอบคุณขอโทษด้วยความสับสนฉันแรกเขียนตัวอย่าง foo / bar แต่วางข้อผิดพลาดจากการทดสอบจริงของฉัน จะไม่ทำมันอีก :) และขอโทษด้วยสำหรับความผิดของฉันฉันมีสาขา "แล็บ" อยู่แล้ว

33

บางครั้งปัญหานั้นเกิดขึ้นถ้าคุณมีสาขาที่มีชื่อฐานอยู่แล้ว

ฉันลองสิ่งนี้:

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

น่าเสียดายที่ฉันมีสาขาชื่อfeaturesแล้วและฉันได้รับข้อยกเว้นของผู้ถามคำถาม

การลบสาขาfeaturesแก้ไขปัญหาได้คำสั่งดังกล่าวทำงาน


32

ในกรณีของฉันฉันลืมว่ามีlabsสาขาที่ไม่ได้ใช้แล้ว การลบมันแก้ไขปัญหา:

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

คำอธิบาย:

แต่ละชื่อสามารถเป็นสาขาหลักหรือสาขาปกติเท่านั้นไม่ใช่ทั้งสองชื่อ นั่นเป็นเหตุผลว่าทำไมสาขาlabs และ labs/featureไม่มีอยู่ทั้งสองในเวลาเดียวกัน

สาเหตุของพฤติกรรมนี้คือสาขาถูกเก็บไว้ในระบบไฟล์และคุณไม่สามารถมีไฟล์labsและไดเรกทอรีlabsในระดับเดียวกันได้


-1

ฉันอาจจะผิด แต่ฉันคิดว่าเครื่องหมายทับจะปรากฏในชื่อสาขาเมื่อพวกเขาเกี่ยวข้องกับ repo ระยะไกลorigin/masterเท่านั้น


11
เป็นไปได้อย่างสมบูรณ์ - และเป็นเรื่องธรรมดา - ในการสร้างกิ่งก้านสาขาท้องถิ่นด้วย '/' ในชื่อของพวกเขา เป็นวิธีการทั่วไปในการจัดกลุ่มสาขาที่เกี่ยวข้องใน 'namespace'
CB Bailey

ใช่ว่าจะซื่อสัตย์ซึ่งอาจสร้างความสับสนเมื่อเรียนรู้ แต่การตั้งชื่อก็มีประโยชน์เช่นกัน จากนั้นอีกครั้งโดยใช้เครื่องหมายทับหรือขีดฉันไม่แน่ใจว่ามันสำคัญกว่ารสนิยมส่วนตัวหรือไม่

2
git flow ใช้การกำหนดเนมสเปซแบบนี้ :)
Rimian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.