Git リポジトリの `cp -uav` で一部のファイルが「削除済み」と表示されるのはなぜですか?

Git リポジトリの `cp -uav` で一部のファイルが「削除済み」と表示されるのはなぜですか?

以前はcp -uav、コミットされていないファイルを含む Git リポジトリのコピーを更新していました。

なぜファイルを削除していると表示されるのでしょうか? 次のようになります:

$ cp -uav repos copy
removed 'copy/repos/h/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391'
removed 'copy/repos/h/.git/objects/3b/b3f834dd037db9298b10d71e0cd7383000fa1c'
removed 'copy/repos/h/.git/objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba'
removed 'copy/repos/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885'

$ rpm -q --whatprovides `which cp`
coreutils-8.25-17.fc25.x86_64

答え1

上記のメッセージを次のように再現できます。

mkdir test; cd test
mkdir repos; cd repos

mkdir g; cd g
git init
touch a
git add a
git commit -m test
cd ..

git clone g h
cd ..

mkdir copy
cp -ua repos copy
cp -uav repos copy

cp -ua次のコマンドを実行すると、指定されたファイルがstrace実際に削除されていることが分かります ( )。unlink

何が起こったかというと、 内のオブジェクトがrepo/h/.git/objects内のオブジェクトのハードリンクになっているのですrepo/g/.git/objects。(私の最初のケースでは、メイン リポジトリのクローンとして作成されたサブ リポジトリを含むリポジトリをコピーしていました)。

cp -aを意味しcp --preserve、次のように文書化されている。

--preserve[=ATTR_LIST]

指定された属性(デフォルト:モード、所有権、タイムスタンプ)を保持します。可能な場合は、追加の属性:コンテキスト、リンク、xattr、すべて

リンク解除はハードリンクの保存の一環として行われます。

linkat(AT_FDCWD, "copy/repos/g/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885", AT_FDCWD, "copy/repos/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885", 0) = -1 EEXIST (ファイルが存在します)

リンクを解除("copy/repos/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885") = 0

リンクat(AT_FDCWD、"コピー/リポジトリ/g/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885"、AT_FDCWD、"コピー/リポジトリ/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885"、0) = 0

一体なぜ私を混乱させるようなメッセージが生成されるのでしょうか?

-uこのコードでは( ) がまだ実装されていないようです--update。これは主に、不必要なデータの再コピーを避けるためのパフォーマンス最適化です。ハードリンクを作成する場合、データのコピーは必要ありません。

ドキュメントには、cpファイルを削除する必要がある他のシナリオも記載されています。

   -f, --force

         if an existing destination file cannot be opened, remove it and try again (this option is ignored when the -n option is also used)

の場合-f、「強制」する必要がある特定のファイルを表示したい場合があることは理解できます。

中断された場合に削除を表示することも役立つと思いますcp。そうしないと、ユーザーがファイルが宛先から削除された可能性があることに気付かないでしょう (中間ステップとして)。

最終的な疑問は、リンクを再作成したときに、混乱が少なくなるはずのメッセージも表示されないのはなぜかということです。これはオプションの癖ではないかと考えています-u

関連情報