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。gitはあなたHEADlabs/feature作成されていないブランチへのリンクであると考えているようです。これがどのようにして発生したのかはわかりませんが、これfoo/barを基にして呼び出されるブランチを作成しようとしても機能しません。どうやってあなたHEADが行き詰まったのか?
CBベイリー

「foo / bar」ではなく、「labs / feature」という編集例を混乱させて申し訳ありません。

スラッシュの前FWIWのものは下のディレクトリが生成されます.git/refs/heads、あなたがしなければ、すなわちgit checkout -b feature/123、あなたの内側に、その後projectRootFolder/.git/refs/heads:ディレクトリという名前のディレクトリ参照してくださいよfeature、そのディレクトリ内の名前付きブランチが表示されます123。あなたが別のものを作成した場合、後でfeature/124内側その後、featureディレクトリ、名前付きブランチ表示されます124
ハニー

:-D「あなたはあなたに問題が持っているように実際に見えるHEADニース1 @CBBailey」
ケントブル

回答:


222

labsこのスレッドのように)ブランチがまだ存在していないことを確認しますか?

同じ名前のファイルとディレクトリの両方を持つことはできません。

あなたは基本的にこれをgitにさせようとしている:

% 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
深く返信してくれてありがとう..興味深いことに、私はgitブランチfoo / barを試しました(うまくいった)。次にgitブランチ-d foo / barですが、foo /ディレクトリ(現在は空)がまだ存在していることがわかります。編集:そして「git branch foo」を実行するとすぐに置き換えられます。すべては順調です。

1
@faB:邪悪な...しかし、予期しないことではありません:( ' foo'名前空間で)バーを削除しましたが、foo(他のブランチの名前空間として機能するか、ブランチ自体になる可能性があります)
VonC

これは実際には問題ではありませんが、gitはを呼び出してもそのスタンスを変更しないpack-refsため、これからあなたを保護することはできません。
ジョシュ・リー

23
答えを要約すると、ブランチ名にスラッシュを含めることができます。OPはすでにlabsブランチを持っておりlabs/feature、それを作成しようとしました。
duozmo 2014年

107

階層的なブランチ名(スラッシュ付きのブランチ名)を持つことが可能です。たとえば、私のリポジトリにはそのようなブランチがあります。注意点の1つは、リポジトリにブランチ「foo」とブランチ「foo / bar」の両方を含めることはできないということです。

あなたの問題は、名前にスラッシュを含むブランチを作成することではありません。

$ gitブランチfoo / bar
エラー:参照refs / heads / labs / featureを解決できません:ディレクトリではありません
致命的:更新用の参照のロックに失敗しました:ディレクトリではありません

上記のエラーメッセージは、「foo / bar」ではなく「labs / feature」ブランチについて語っています(コピーと貼り付けの間違いでない限り、つまり、セッションの一部を編集した場合)。git branchor の結果は何git rev-parse --symbolic-full-name HEADですか?


1
ありがとう、混乱して申し訳ありません。最初にfoo / barの例を書きましたが、実際のテストからのエラーメッセージを貼り付けました。もう一度やるつもりはありません:)そして、私の間違いも申し訳ありませんが、確かに私はすでに「labs」ブランチを持っていました。

33

ベース名を持つブランチがすでにある場合、その問題が発生することがあります。

私はこれを試しました:

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

残念ながら、私は既にという名前のブランチを持っていてfeatures、質問askerの例外を受け取りました。

ブランチを削除するとfeatures問題が解決し、上記のコマンドが機能しました。


32

私の場合、未使用のlabsブランチが既にあることを忘れていました。それを削除すると問題は解決しました:

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

説明:

それぞれの名前は、親ブランチまたは通常のブランチのみであり、両方ではありません。ザッツなぜ枝labs labs/feature、両方を同時に存在することはできません。

この動作の理由は、ブランチがファイルシステムに格納されているため、ファイルlabsとディレクトリlabsを同じレベルにすることはできないためです。


-1

私は間違っているかもしれませんが、たとえばスラッシュがブランチ名に表示されるのは、それらがリモートリポジトリに関連しているときだけだと思いましたorigin/master


11
名前に「/」を含むローカルブランチを作成することは完全に可能であり、実際に一般的です。これは、関連するブランチを「名前空間」にグループ化する一般的な方法です。
CBベイリー

正直に言うと、学習時に混乱する可能性がありますが、ネーミングも役立ちます。次に、もう一度スラッシュまたはダッシュを使用しますが、個人的な趣味以外の問題かどうかはわかりません。

2
git flowはこのスタイルの名前空間を使用します:)
Rimian '11 / 11/12
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.