Только что натолкнулся на странный случай du
. Размещение аргументов одним способом дает:
$ du -s htdocs/.git/ feuerkraft/.git/ media/.git/
40564 htdocs/.git/
40740 feuerkraft/.git/
204 media/.git/
Размещение их в другом порядке изменяет размер последнего каталога:
$ du -s media/.git/ htdocs/.git/ feuerkraft/.git/
40696 media/.git/
40564 htdocs/.git/
248 feuerkraft/.git/
Это должны быть обычные каталоги:
$ ls -l */.git -d -i
4891918 drwxrwxr-x 1 ingo ingo 138 Mar 28 08:41 feuerkraft/.git
4892896 drwxrwxr-x 1 ingo ingo 138 Mar 28 08:44 htdocs/.git
4893874 drwxrwxr-x 1 ingo ingo 138 Mar 28 08:42 media/.git
Выполнение этого вручную дает:
$ for i in htdocs/.git/ feuerkraft/.git/ media/.git/; do du -s "${i}"; done
40564 htdocs/.git/
40740 feuerkraft/.git/
40696 media/.git/
Когда я копирую каталог с cp -axv
, проблема остается, если я копирую каталог с cp -rxv
, она исчезает.
Копаем глубже:
$ du -s feuerkraft/.git/objects/pack/pack-26b69bdec4b3fd894bf7984d23e1938b522e6d53.pack media/.git/objects/pack/pack-26b69bdec4b3fd894bf7984d23e1938b522e6d53.pack htdocs/.git/objects/pack/pack-31a80589fbb132827d19b718c07aba1aa6bb9c02.pack | wc -l
2
$ ls feuerkraft/.git/objects/pack/pack-26b69bdec4b3fd894bf7984d23e1938b522e6d53.pack media/.git/objects/pack/pack-26b69bdec4b3fd894bf7984d23e1938b522e6d53.pack htdocs/.git/objects/pack/pack-31a80589fbb132827d19b718c07aba1aa6bb9c02.pack | wc -l
3
du
перечисляют только 2 файла, если дано три, ls
перечисляют 3.
Файловая система - btrfs
. Это ошибка или что-то со сжатием / копированием при записи или чем-то еще?
Это объясняет его:
$ ls -l feuerkraft/.git/objects/pack/pack-26b69bdec4b3fd894bf7984d23e1938b522e6d53.pack media/.git/objects/pack/pack-26b69bdec4b3fd894bf7984d23e1938b522e6d53.pack htdocs/.git/objects/pack/pack-31a80589fbb132827d19b718c07aba1aa6bb9c02.pack -i
13150428 -r--r--r-- 2 ingo ingo 41191354 Mar 15 14:14 feuerkraft/.git/objects/pack/pack-26b69bdec4b3fd894bf7984d23e1938b522e6d53.pack
13151244 -r--r--r-- 1 ingo ingo 41197513 Mar 28 08:44 htdocs/.git/objects/pack/pack-31a80589fbb132827d19b718c07aba1aa6bb9c02.pack
13150428 -r--r--r-- 2 ingo ingo 41191354 Mar 15 14:14 media/.git/objects/pack/pack-26b69bdec4b3fd894bf7984d23e1938b522e6d53.pack
feuerkraft
и media
файлы указывают на тот же inode, т.е. жесткие ссылки. Это - функция git clone
и зарегистрированный в страницу справочника:
$ man git clone
...
--no-hardlinks
Force the cloning process from a repository on a local filesystem to copy
the files under the .git/objects directory instead of using hardlinks.
This may be desirable if you are trying to make a back-up of your
repository.
Это также объясняет, почему git
наборы файлы пакета к только для чтения, всегда задавался вопросом об этом. du
также имеет опцию считать жесткие ссылки дважды:
$ man du
...
-l, --count-links
count sizes many times if hard linked
И это дает ожидаемые результаты:
$ du -ls media/.git/ htdocs/.git/ feuerkraft/.git/
40696 media/.git/
40564 htdocs/.git/
40740 feuerkraft/.git/