2016-10-05 6 views
11

私はいくつかのサーバー側のソフトウェアをマージするために取り組んでいます。 git worktreeを使用すると、特定のブランチをチェックして別のブランチをマージすることができます。大規模なリポジトリであっても、非常に高速です。Git - 裸のレポはマスターブランチのワークツリーを持つことができません - なぜですか?

唯一の例外はmasterにマージされているようです。私はgit worktree add /tmp/path/to/worktree masterを行うと、私はエラーを取得する:

/path/to/bare/repo (bare)

を...そしてもちろん、何の作業ツリーはちょうど、そのパスではありません。

fatal: 'master' is already checked out at '/path/to/bare/repo'

しかし、これは明らかに事実ではない、git worktree listができますあなたが期待する裸のレポファイル。

更新:私はgitの管理者に連絡を取りましたが、これはバグかもしれないことに同意しています。私は彼らからテストのための予備的なパッチを持っています。また、希望のの動作をパッチなしで再現することもできました。

この時点で、私は境界条件や根本原因が何であるか完全にはわかりませんし、gitの修正が予定されているかもしれません。

+0

ドキュメントを読むことから、これを動作させるためにブランチを作成するには '-b'オプションを渡す必要があるようです。 –

+0

Hm。しかし、このレポには既存のマスターブランチがあります。エラーメッセージもそのことを確認しているようです。 上記の説明から明らかではないかもしれませんが、このアプローチは、*マスターから別のブランチにマージすることを含め、他のブランチとうまく機能します(エラーメッセージなし)。 – mtutty

答えて

6

これはgitのバグで、2.5以降のワークツリーの実装から始まります。

裸のリポジトリにはまだHEADの再リンクがあります。リンクが指しているものはgit(2.10まで)が新しいクローナのデフォルトブランチとみなされ、アクティブな作業ツリー上にあるかのように(間違って)扱われます。

この動作を修正するためにgitの管理者からパッチが届きましたが、動作するようです。あるいは、マスターから一時的に切り替えるために、裸のレポに対してupdate-refを使用することも可能です。

これらのオプションを両方ともテストします。

3

これは間違っていると思います。それを報告することもできます。私はまだ議論を見つけることができませんでしたが、このケースは明らかです。

回避策として、git update-ref --no-deref HEAD 'HEAD^{commit}'を実行できます。現在のHEADを切り離して、マスタがチェックアウトされないようにします。

関連する問題