web-dev-qa-db-ja.com

'<Branch>'はgitワークツリーの '</ other / location>'で既にチェックアウトされています

Git worktreesを使い始めました。動作するようですが、クローンされたワークツリーのブランチをチェックアウトしようとすると、次のエラーが発生します。

fatal: '<branch>' is already checked out at '</other/location>'

.git/worktreesディレクトリを削除せずにこれを回避するにはどうすればよいですか?

26
Harald Nordgren

Gitでは、同じブランチを2回チェックアウトすることはできません。これを行うと、2つの作業ツリーの1つに移動して新しいコミットを作成すると、に戻ったときに悲惨な状況に陥ります- その他作業ツリー。

他のワークツリーを実際に削除した場合は、git worktree Pruneを実行して、Gitにこれを認識させます。 notが実際に他の作業ツリーを削除している場合は、2回チェックアウトしないでください。面白くないです。

25
torek

どうすれば.git/worktreesディレクトリを削除せずにこれを回避できますか?

「_git worktree_」が「move」および「remove」サブコマンドを学習したため、Git 2.17+(2018年第2四半期)を使用すると、より簡単に作業できます。

Eric Sunshine(sunshineco による commit 7f19def (2018年3月4日)を参照してください。
commit ee6763acommit cc73385commit 78d986bcommit c64a8d2commit 9f792bbcommit 9c620fc (2018年2月12日)、および commit 4ddddc1 (2018年1月24日)by NguyễnTháiNgọcDuy(pclouds
Junio C Hamano-gitster- によってマージ commit bd0f794 、2018年3月14日)

あなたのケースでは、既存のワークツリーを今望む場所に(同じブランチに新しいワークツリーを作成しようとするときに)移動できます。

_worktree move_:新しいコマンド

このコマンドを使用すると、リンクされたワークツリーを再配置できます。
メインワークツリーは(まだ)移動できません。

そして:

_worktree move_:サブモジュールを含むワークツリーの移動を拒否

サブモジュールには、相対パスを持つ_.git_ファイルが含まれています。
_worktree move_の後で、これらのファイルを更新する必要があります。そうしないと、どこにもポイントされない場合があります。

これは、「_worktree move_」が誤って人々のワークツリーを壊さないようにするための包帯パッチです。
_.git_ファイル更新コードが配置されている場合、このvalidate_no_submodules()を削除できます。


注:Git 2.21(2019年第1四半期)より前のバージョンでは、「_git worktree remove_」および「_git worktree move_」は、サブモジュールが関係する場合に機能しませんでした。
これは、初期化されていないサブモジュールを無視するために緩和されています

3
VonC

ワークツリーと元のリポジトリの両方で2回チェックアウトすることはできないため。ワークツリーをチェックアウトする前に、元のリポジトリを別の場所にチェックアウトしませんか?

git -C </other/location> checkout <branch>~1
git -C <worktree> checkout <branch>
1
Ramius

これは、$pwdにリンクがある場合にも発生することに注意してください。チェックする前に、gitreadlink -f$pwdになっているはずです。

編集:または、実際にgit worktree Pruneに電話を逃したことが原因である可能性があります。今それは働いています。

0
Sebastian Graf

目的のブランチのworktreeディレクトリに移動するだけで、自動的にcheckoutが実行されます。

私の場合、2つの長期実行worktreeがあります。これは、masterの横にある2つの関連ブランチを意味します。

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

リポジトリは1つですが、上記の各ブランチには3つの別々のフォルダが並んでいます。そして、masterに一般的な変更を加えます。次に、他の両方のバージョンとマージします。

各バージョンの特定の変更も対応するフォルダーに入れられ、各プロジェクトの作業は分離され、IDEと混同しないでください。

お役に立てば幸いです。

0
vaheeds

reallyが必要な場合は、それぞれのHEADファイルでrefを直接変更するか、またはgit checkout -B master Origin/masterなどを使用して同じ名前のブランチを再作成することにより、このチェックをバイパスできます

他の人が言ったように、あなたは自分が何をしているかを知る必要があります。ブランチはすべてのワークツリーに共通です。1つのワークツリーで1つ変更すると、他のワークツリーのステータスにすぐに影響します。

0
Hound