Git worktreesを使い始めました。動作するようですが、クローンされたワークツリーのブランチをチェックアウトしようとすると、次のエラーが発生します。
fatal: '<branch>' is already checked out at '</other/location>'
.git/worktrees
ディレクトリを削除せずにこれを回避するにはどうすればよいですか?
Gitでは、同じブランチを2回チェックアウトすることはできません。これを行うと、2つの作業ツリーの1つに移動して新しいコミットを作成すると、に戻ったときに悲惨な状況に陥ります- その他作業ツリー。
他のワークツリーを実際に削除した場合は、git worktree Prune
を実行して、Gitにこれを認識させます。 notが実際に他の作業ツリーを削除している場合は、2回チェックアウトしないでください。面白くないです。
どうすれば.git/worktreesディレクトリを削除せずにこれを回避できますか?
「_git worktree
_」が「move
」および「remove
」サブコマンドを学習したため、Git 2.17+(2018年第2四半期)を使用すると、より簡単に作業できます。
Eric Sunshine(sunshineco
) による commit 7f19def (2018年3月4日)を参照してください。
commit ee6763a 、 commit cc73385 、 commit 78d986b 、 commit c64a8d2 、 commit 9f792bb 、 commit 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
_」は、サブモジュールが関係する場合に機能しませんでした。
これは、初期化されていないサブモジュールを無視するために緩和されています 。
ワークツリーと元のリポジトリの両方で2回チェックアウトすることはできないため。ワークツリーをチェックアウトする前に、元のリポジトリを別の場所にチェックアウトしませんか?
git -C </other/location> checkout <branch>~1
git -C <worktree> checkout <branch>
これは、$pwd
にリンクがある場合にも発生することに注意してください。チェックする前に、git
がreadlink -f
で$pwd
になっているはずです。
編集:または、実際にgit worktree Prune
に電話を逃したことが原因である可能性があります。今それは働いています。
目的のブランチの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と混同しないでください。
お役に立てば幸いです。
reallyが必要な場合は、それぞれのHEADファイルでrefを直接変更するか、またはgit checkout -B master Origin/master
などを使用して同じ名前のブランチを再作成することにより、このチェックをバイパスできます
他の人が言ったように、あなたは自分が何をしているかを知る必要があります。ブランチはすべてのワークツリーに共通です。1つのワークツリーで1つ変更すると、他のワークツリーのステータスにすぐに影響します。