Sử dụng ký tự gạch chéo trong tên nhánh Git


222

Tôi khá chắc chắn rằng tôi đã thấy ở đâu đó trong một dự án Git nổi tiếng, các chi nhánh có mô hình như "Feature / xyz".

Tuy nhiên, khi tôi cố gắng tạo một nhánh với ký tự gạch chéo, tôi gặp lỗi:

$ 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

Vấn đề tương tự cho (nỗ lực ban đầu của tôi):

$ git checkout -b labs/feature

Làm thế nào để người ta tạo một nhánh trong Git với ký tự gạch chéo?

git  branch 

1
Trên thực tế có vẻ như bạn có vấn đề với của bạn HEAD. Có vẻ như git nghĩ rằng bạn HEADlà một liên kết đến chi nhánh labs/featurechưa được tạo. Tôi không biết làm thế nào điều này có thể xảy ra, nhưng điều đó có nghĩa là nỗ lực của bạn để tạo ra một nhánh được gọi là foo/bardựa trên nó, nó không hoạt động. Bất cứ ý tưởng làm thế nào bạn HEADđến unstuck?
CB Bailey

Tôi xin lỗi vì sự nhầm lẫn, "phòng thí nghiệm / tính năng" của nó, không phải "foo / bar", ví dụ đã được chỉnh sửa.

FWIW bất cứ điều gì trước dấu gạch chéo sẽ tạo ra một thư mục bên dưới .git/refs/headstức là nếu bạn làm thế git checkout -b feature/123thì trong projectRootFolder/.git/refs/headsthư mục của bạn, bạn sẽ thấy một thư mục có tên: featuretrong đó trong thư mục đó bạn sẽ thấy một nhánh có tên 123. Sau này nếu bạn tạo một cái khác feature/124thì trong featurethư mục, bạn sẽ thấy một nhánh có tên124
Honey

:-D "Thật ra có vẻ như bạn có vấn đề với HEAD" Nice one @CBBailey
Kent Bull

Câu trả lời:


222

Bạn có chắc rằng nhánh labschưa tồn tại (như trong chủ đề này )?

Bạn không thể có cả tệp và thư mục có cùng tên.

Bạn đang cố gắng để có được git để làm điều này về cơ bản:

% 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

Bạn đang nhận được tương đương với lỗi "không thể tạo thư mục".
Khi bạn có một nhánh có dấu gạch chéo trong nó, nó sẽ được lưu dưới dạng phân cấp thư mục bên dưới .git/refs/heads.


3
Cảm ơn đã trả lời sâu sắc .. Interstingly tôi đã thử git chi nhánh foo / bar (hoạt động); sau đó git nhánh -d foo / bar, nhưng tôi thấy rằng thư mục foo / (hiện trống) vẫn còn tồn tại! EDIT: và nó được thay thế ngay khi tôi làm "git Branch foo". Tất cả đều tốt.

1
@faB: độc ác ... nhưng không bất ngờ: bạn đã xóa thanh (trong fookhông gian tên ''), nhưng không foo(có thể đóng vai trò là không gian tên cho nhánh khác hoặc là một nhánh)
VonC

Điều này không thực sự quan trọng, nhưng git không thay đổi lập trường ngay cả khi bạn gọi pack-refs, vì vậy nó sẽ vượt ra ngoài để bảo vệ bạn khỏi điều này.
Josh Lee

23
Để tóm tắt câu trả lời: Bạn có thể có dấu gạch chéo trong tên nhánh. OP đã có một labschi nhánh và cố gắng tạo ra labs/feature, điều này khiến họ chùn bước.
duozmo

107

Có thể có tên nhánh phân cấp (tên nhánh có dấu gạch chéo). Ví dụ trong kho lưu trữ của tôi, tôi có chi nhánh như vậy. Một lưu ý là bạn không thể có cả nhánh 'foo' và nhánh 'foo / bar' trong kho lưu trữ.

Vấn đề của bạn không phải là tạo chi nhánh với dấu gạch chéo.

$ git chi nhánh foo / bar
lỗi: không thể giải quyết tham chiếu / thủ trưởng / phòng thí nghiệm / tính năng: Không phải là thư mục
fatal: Không thể khóa ref để cập nhật: Không phải là một thư mục

Thông báo lỗi ở trên nói về nhánh 'labs / Feature', không phải 'foo / bar' (trừ khi đó là lỗi trong copy'n'paste, tức là bạn đã chỉnh sửa các phần của phiên). Kết quả củagit branch hoặc là git rev-parse --symbolic-full-name HEADgì?


1
Cảm ơn, xin lỗi về sự nhầm lẫn, lần đầu tiên tôi đã viết một ví dụ foo / bar, nhưng dán thông báo lỗi từ thử nghiệm thực tế của tôi. Sẽ không làm điều đó một lần nữa :) Và cũng xin lỗi vì sai lầm của tôi, thực sự tôi đã có một chi nhánh "phòng thí nghiệm".

33

Đôi khi vấn đề đó xảy ra nếu bạn đã có một chi nhánh với tên cơ sở.

Tôi đã thử điều này:

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

Thật không may, tôi đã có một chi nhánh được đặt tên featuresvà tôi đã nhận được ngoại lệ của người hỏi.

Loại bỏ các chi nhánh featuresgiải quyết vấn đề, lệnh trên đã làm việc.


32

Trong trường hợp của tôi, tôi quên rằng đã có một labschi nhánh chưa sử dụng . Xóa nó đã giải quyết vấn đề:

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

Giải trình:

Mỗi tên chỉ có thể là một nhánh cha hoặc một nhánh bình thường, không phải cả hai. Đó là lý do tại sao các chi nhánh labs labs/feature không thể tồn tại cả hai cùng một lúc.

Lý do cho hành vi này là các nhánh được lưu trữ trong hệ thống tệp và ở đó bạn cũng không thể có tệp labsvà thư mục labsở cùng cấp.


-1

Tôi có thể sai, nhưng tôi nghĩ rằng dấu gạch chéo chỉ xuất hiện trong tên nhánh khi chúng liên quan đến repo từ xa chẳng hạn origin/master.


11
Hoàn toàn có thể - và thực sự phổ biến - để tạo các nhánh địa phương với '/' trong tên của chúng. Đó là một cách phổ biến để nhóm các nhánh liên quan trong một "không gian tên".
CB Bailey

Vâng thành thật mà nói có thể gây nhầm lẫn khi học, nhưng việc đặt tên cũng có thể hữu ích. Sau đó, một lần nữa sử dụng dấu gạch chéo hoặc dấu gạch ngang, tôi không chắc liệu nó có quan trọng ngoài sở thích cá nhân không?

2
git Flow sử dụng kiểu không gian tên này :)
Rimian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.