git worktreeコマンドと、-sharedスイッチを使用してリポジトリを複数回複製することにより、リポジトリをローカルで共有することの違いは何ですか?
私の目的は、比較的大きなリポジトリを開発者のマシンのディスクに1回だけ複製し、その1つのリポジトリを複数のブランチでの開発に使用することです。Eclipseを使用しており、Eclipseは現時点ではワークツリーをサポートしていないため、gitワークツリーを使用することはできません。
私が試したこととうまくいくように見えることは次のとおりです。
git clone ssh://host/repo.git repository-master
git clone --shared repository-master/ repository-branch1/
git remote add gitlab ssh://host/repo.git
git fetch
git checkout -b branch1 gitlab/branch1
これはすべての問題を解決するようです:
ここで何かが足りませんか?確かに、利便性以外に、これよりもworktreeコマンドを使用する理由があるはずですか?
を使用するクローン--shared
(または--shared
一部のパス名ベースのクローンから暗黙的に)は、別個のリポジトリです。ハードリンク使用することにより1(オペレーティング・システムによってサポートされなければならない)、あなたはディスクスペースを節約するすべての良さを取得、2、Gitは既存のデータを上書きすることはありませんので、それだけでは比較的まれなケースでは、新たなデータやを、追加し、合計安全性ファイルのリンクを解除します。これにより、ファイルを使用するGitリポジトリの数が減るだけなので無害になります。
作業ツリーで作られたが、git worktree add
、ではない別のリポジトリ。あなたが行うすべてにあなたがしていることを任意のブランチやタグに、その作業ツリーではないという作業ツリー内には、すぐにリポジトリを共有する他のすべての作業の木で見られています。ワークツリーには、独自のHEAD
(通常はブランチ名にアタッチされますが、オプションでデタッチされます)、独自のインデックス、そしてもちろん独自のワークツリーがあります。他のほとんどすべてが共有されます(forなど、魔法のようにプライベートな参照が他にもいくつかありgit bisect
ますが、たとえば、スタッシュはワークツリー間で共有されます)。
既存のプロセスは問題ありません。脚注2で説明されているように、ディスクスペースの共有は最終的に低下することに注意してください。
1基になるファイルオブジェクトへのハードリンクを作成すると、新しい名前が追加され、リンク数が増加します。リンク数は常にファイルの名前の数を表します。上記のリンク解除操作は、ファイルの削除ではなく、名前の削除です。ファイル自体は、最後の参照がなくなったときにのみ消えます。
2この節約は、時間の経過とともに低下します。2つの別々のリポジトリは、最初はすべての基盤となるストレージを共有しますが、ある時点で、1つのリポジトリが、緩いオブジェクトをパックするか、既存のパックを再パックして、いくつかのリンクを切断することを決定します。もう一方のリポジトリには、本質的に、独自のプライベートコピーがあります。最終的には、すべてのリンクが切断された可能性があるため、各リポジトリは完全に独立しています。リポジトリは引き続き機能しますが、スペースを節約することはできなくなりました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加