Gitの2.5は、2015年7月以来の代替提案contrib/workdir/git-new-workdir
:gitのworktreeを
Junio C Hamano()によるcommit 68a2e6aを参照してください。gitster
リリースノートには言及します:
その代わりはcontrib/workdir/git-new-workdir
、シンボリックリンクに依存せず、借り手の借り手と借り手のお互いを認識させることでオブジェクトと参照の共有をより安全にします。
コミット799767cc9(Git 2.5rc2)を参照
つまり、これでgit worktree add <path> [<branch>]
作成<path>
してチェックアウト<branch>
します。新しい作業ディレクトリは現在のリポジトリにリンクされ、HEAD、インデックスなどの作業ディレクトリ固有のファイルを除くすべてを共有しgit worktree
ます。
gitリポジトリは複数の作業ツリーをサポートできるため、一度に複数のブランチをチェックアウトできます。
を使用するgit worktree add
と、新しい作業ツリーがリポジトリに関連付けられます。
この新しい作業ツリーは、「git init
」または「git clone
」によって作成された「メイン作業ツリー」ではなく、「リンクされた作業ツリー」と呼ばれます。
リポジトリには、1つのメイン作業ツリー(ベアリポジトリでない場合)と0個以上のリンクされた作業ツリーがあります。
詳細:
リンクされた各作業ツリーには、リポジトリの$GIT_DIR/worktrees
ディレクトリにプライベートサブディレクトリがあります
。
プライベートサブディレクトリの名前は通常、リンクされた作業ツリーのパスのベース名であり、一意にするために番号が追加されている可能性があります。
たとえば$GIT_DIR=/path/main/.git
、コマンドgit worktree add /path/other/test-next next
が次のものを作成する場合:
- リンクされた作業ツリー
/path/other/test-next
と
- また、
$GIT_DIR/worktrees/test-next
ディレクトリを作成します(または既に取得されている$GIT_DIR/worktrees/test-next1
場合test-next
)。
リンクされた作業ツリー内:
$GIT_DIR
このプライベートディレクトリをポイントするように設定されています(例/path/main/.git/worktrees/test-next
では)。
$GIT_COMMON_DIR
メインの作業ツリー$GIT_DIR
(例:)を指すように設定されています/path/main/.git
。
これらの設定は.git
、リンクされた作業ツリーの最上位ディレクトリにあるファイルで行われます。
リンクされた作業ツリーが完了したら、単に削除できます。
リポジトリ内作業ツリーの管理ファイルは、最終的に(参照自動的に削除されますgc.pruneworktreesexpire
にgit config
)、またはあなたが実行できるgit worktree prune
すべての古い管理ファイルをクリーンアップするために、メインまたは任意のリンク作業ツリーに。
警告:注意すべきgit worktree
「バグ」セクションがまだあります。
サブモジュールのサポートは不完全です。
スーパープロジェクトを複数回チェックアウトすることはお勧めしません。
注:git 2.7rc1(2015年11月)では、ワークツリーを一覧表示できます。
参照bb9c03bをコミットし、92718b7をコミットし、5193490をコミットし、1ceb7f9をコミットし、1ceb7f9をコミットし、5193490をコミットし、1ceb7f9をコミットし、1ceb7f9コミット、(2015年10月8日)を92718b7コミット、5193490をコミットし、1ceb7f9をコミットし、1ceb7f9コミット、(2015年10月8日)の5193490をコミットし、1ceb7f9をコミット(2015年10月8日)、1ceb7f9をコミット(2015年10月8日)、ac6c561をコミット(2015年10月2日)by Michael Rappazzo(rappazzo
)。
(による合併Junio C浜野- gitster
-でa46dcfbをコミットし、2015年10月26日)
worktree
: ' list
'コマンドを追加
' git worktree list
'はワークツリーリストを反復処理し、ワークツリーへのパス、現在チェックアウトされているリビジョンとブランチ、およびワークツリーが裸かどうかを含むワークツリーの詳細を出力します。
$ git worktree list
/path/to/bare-source (bare)
/path/to/linked-worktree abcd1234 [master]
/path/to/other-linked-worktree 1234abc (detached HEAD)
磁器フォーマットのオプションも利用できます。
磁器の形式には、属性ごとに1つの線があります。
- 属性は、1つのスペースで区切られたラベルと値とともにリストされます。
- ブール属性( 'bare'や 'detached'など)はラベルとしてのみリストされ、値がtrueの場合にのみ存在します。
- 空の行はワークツリーの終わりを示します
例えば:
$ git worktree list --porcelain
worktree /path/to/bare-source
bare
worktree /path/to/linked-worktree
HEAD abcd1234abcd1234abcd1234abcd1234abcd1234
branch refs/heads/master
worktree /path/to/other-linked-worktree
HEAD 1234abc1234abc1234abc1234abc1234abc1234a
detached
注:ワークツリーフォルダーを移動する場合は、ファイルを手動で更新する必要がありgitdir
ます。
参照してください618244eコミット(2016年1月22日)を、そしてd4cddd6コミット(2016年1月18日)によるグエンタイ・ゴックDuyと(pclouds
)。
協力者:エリックサンシャイン(sunshineco
)。
(合併によりJunio C浜野- gitster
-でd0a1cbcコミット、2016年2月10日)を
git 2.8(2016年3月)の新しいドキュメントには、次のものが含まれます。
リンクされた作業ツリーを移動する場合gitdir
は、エントリのディレクトリにある ' 'ファイルを更新する必要があります。
たとえば、リンクされた作業ツリーがに移動され/newpath/test-next
、その.git
ファイルがを指している/path/main/.git/worktrees/test-next
場合は、代わり/path/main/.git/worktrees/test-next/gitdir
に参照/newpath/test-next
に更新
します。
ブランチを削除するときは注意してください:git 2.9(2016年6月)より前は、別の作業ツリーで使用中のブランチを削除できました。
「git worktree
」機能が使用されている場合、「git branch -d
」は別のワークツリーでチェックアウトされているブランチの削除を許可しました。
山口一樹()によるcommit f292244(2016年3月29日)を参照してください。
協力者:エリックサンシャイン()。(合併によりJunio C浜野- -で4fca4e3コミット、2016年4月13日)をrhenium
sunshineco
gitster
branch -d
:現在チェックアウトされているブランチの削除を拒否
現在の作業ツリーによってブランチがチェックアウトされている場合、ブランチの削除は禁止されています。
ただし、ブランチが他の作業ツリーによってのみチェックアウトされている場合、削除は正しく行われません。現在の作業ツリーのHEADと比較するだけでなく、ブランチが
使用さfind_shared_symref()
れているかどうかを確認するために使用します。
同様に、git 2.9(2016年6月)以前は、別のワークツリーでチェックアウトされたブランチの名前を変更しても、他のワークツリーのシンボリックヘッドは調整されませんでした。
参照してください18eb3a9コミット(2016年4月8日)に、そして70999e9をコミットし、2233066コミット(2016年3月27日)のことで山口和樹(rhenium
)。
(合併によりJunio C浜野- gitster
-で741a694コミット、2016年4月18日)を
branch -m
:すべてのワークツリーHEADを更新します
ブランチの名前を変更すると、現在の作業ツリーのHEADのみが更新されますが、古いブランチを指すすべての作業ツリーのHEADを更新する必要があります。
これは現在の動作です。/path/to/wtのHEADは更新されません。
% git worktree list
/path/to 2c3c5f2 [master]
/path/to/wt 2c3c5f2 [oldname]
% git branch -m master master2
% git worktree list
/path/to 2c3c5f2 [master2]
/path/to/wt 2c3c5f2 [oldname]
% git branch -m oldname newname
% git worktree list
/path/to 2c3c5f2 [master2]
/path/to/wt 0000000 [oldname]
このパッチは、ブランチの名前を変更するときに関連するすべてのワークツリーヘッドを更新することにより、この問題を修正します。
ロック機構はgit 2.10(2016年第3四半期)で正式にサポートされています
参照080739bコミット、6d30862コミット、58142c0コミット、346ef53コミット、346ef53コミット、58142c0コミット、346ef53コミット、346ef53コミット(2016年6月13日に)、そして984ad9eコミット、6835314コミットにより(2016年6月3日)のグエンタイ・ゴックデュイ(pclouds
)。
提案者:エリックサンシャイン(sunshineco
)。
(による合併Junio C浜野- gitster
-で2c608e0コミット、2016年7月28日)を
git worktree lock [--reason <string>] <worktree>
git worktree unlock <worktree>
リンクされた作業ツリーが、常にマウントされているわけではないポータブルデバイスまたはネットワーク共有に格納されている場合は、git worktree lock
コマンドを発行して、その管理ファイルが剪定されないようにすることができます--reason
。
<worktree>
:作業ツリーのパスの最後のパスコンポーネントが作業ツリー間で一意である場合、これを使用して作業ツリーを識別できます。
たとえば、「/abc/def/ghi
」と「/abc/def/ggg
」で作業ツリーのみを使用する必要がある場合、「ghi
」または「def/ghi
」で以前の作業ツリーを指すだけで十分です。
Gitの2.13(Q2 2017)追加lock
オプションで507e6e9コミットすることにより(2017年4月12日)のグエンタイ・ゴックDuyと(pclouds
)。
提案者:デビッドテイラー(dt
)。
協力者:ジェフキング(peff
)。
(合併によりJunio C浜野- gitster
-でe311597コミット、2017年4月26日)を
作成後すぐにワークツリーをロックできるようにします。
これは、「git worktree add; git worktree lock
」と「git worktree prune
」の間の競合を防ぐのに役立ちます。
したがってgit worktree add' --lock
、git worktree lock
after git worktree add
と同等ですが、競合状態はありません。
Gitの2.17+(Q2 2018)を追加git worktree move
/ git worktree remove
:この回答を参照してください。
Git 2.19(2018年第3四半期)に、「--quiet
」オプションを追加して、「」をgit worktree add
冗長にしません。
Elia Pinto()によるcommit 371979c(2018年8月15日)を参照してください。
支援者:MartinÅgren、Duy Nguyen()、およびEric Sunshine()。(による合併Junio C浜野- -でa988ce9コミット 2018年8月27日)devzero2000
pclouds
sunshineco
gitster
worktree
:--quiet
オプションを追加
他のコマンドと同様に、 ' --quiet
'オプションをに追加します。
「」以外のすべてのコマンドは現在デフォルトでサイレントであるため、「」が影響を受ける唯一のコマンドです。git worktree
git
add
list
「git worktree add
」は「statを使用して使用可能な名前を検索してから」を使用していたことに注意してくださいmkdir
。
これは、Git 2.22(2019年第2四半期)でループ内で使用mkdir
および対応することで修正されEEXIST
ました。
Michal Suchanek()によるcommit 7af01f2(2019年2月20日)を参照してください。(合併によりJunio C浜野- -で20fe798コミット、2019年4月9日)をhramrach
gitster
worktree
:worktree add
レースを修正
Gitはstatループを実行して、使用可能なワークツリー名を見つけmkdir
、見つかった名前に対して実行します。
それを回しmkdir
worktreeアド同じ自由な名前を見つけ、最初のディレクトリを作成するための別の呼び出しを避けるために、ループ。
Git 2.22(2019年第2四半期)は、Gitリポジトリに作業ツリーがあるかどうかを通知するロジックを修正し、git branch -D
現在誤ってチェックアウトされているブランチを「」が削除するのを防ぎます。
このロジックの実装は、珍しい名前のリポジトリでは壊れていましたが、最近では残念ながらこれがサブモジュールの標準です。
Jonathan Tan()によるcommit f3534c9(2019年4月19日)を参照してください。(による合併Junio C浜野- -にec2642aコミット、2019年5月8日)をjhowtan
gitster
コードプルリクエスト178インサイト
worktree
:is_bare
ヒューリスティックの更新
" git branch -D <name>
"が実行されると、Gitは通常、最初にそのブランチが現在チェックアウトされているかどうかをチェックします。
ただし、そのリポジトリのGitディレクトリが「<repo>/.git
」でない場合、このチェックは実行されませんsuper/.git/modules/<repo>
。たとえば、そのリポジトリが、Gitディレクトリが「」として保存されているサブモジュールである場合です。
これにより、チェックアウトされていてもブランチが削除されます。
これは、get_main_worktree()
中にworktree.c
セットis_bare
のみworktreeのパスは「で終わらない場合はレポが裸であることをヒューリスティック使用worktree上/.git
」、それ以外の場合は裸ではないが。
このis_bare
コードは、ヒューリスティックに従って92718b7( " worktree
:ワークツリー構造に詳細を追加"、2015-10-08、Git v2.7.0-rc0)で導入されましたpre-core.bare
。
このパッチは2つのことを行います:
- ティーチ
get_main_worktree()
を使用するis_bare_repository()
代わりに、で導入7d1864c(「(is_bare_repository導入)とcore.bare設定変数」、2007年1月7日、Gitのv1.5.0デベロッパー-RC1)とで更新e90fdc3(「クリーンアップ作業ツリーの取り扱い」、2007 -08-01、Git v1.5.3-rc4)。
これにより、git branch -D <name>
上記の「」の問題が解決されます。
ただし...リポジトリにcore.bare=1
" git
"コマンドがそのセカンダリワークツリーの1つから実行されている場合、is_bare_repository()
falseを返します(使用可能なワークツリーがあるため、問題ありません)。
そして、それが裸のときにメインワークツリーを裸でないものとして扱うことは問題を引き起こします:
たとえば、メインワークツリーがむきだしの場合でも、メインワークツリーのHEADによって参照されるセカンダリワークツリーからブランチを削除できない。
それを回避するために、core.bare
設定時にも確認してくださいis_bare
。
の場合core.bare=1
は信頼し、そうでない場合はを使用しますis_bare_repository()
。
git-new-workdir
git checkout --to=<path>
Git 2.5 で置き換えられます。以下の私の回答を