Я экспериментирую с приложением git, и прежде чем импортировать слишком много в приложение git, я бы хотел выяснить, как быстро удалить "присоединенный" репозиторий git, не теряя при этом содержимое моего вложенного файла и его структуру каталогов. Все "дополнительные" файлы на самом деле являются символическими ссылками на .git/annex/objects
, например так:
$ git init
Initialised empty Git repository in /tmp/annex/.git/
$ git annex init
init ok
(recording state in git...)
$ touch foo
$ git annex add foo
add foo ok
(recording state in git...)
$ git commit -a
[master (root-commit) 609a6df] Initial
1 file changed, 1 insertion(+)
create mode 120000 foo
$ ls -l foo
lrwxrwxrwx 1 me me 178 Jan 6 15:10 foo -> .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Поэтому простое удаление каталога .git также приведет к удалению всего содержимого файла!
Мне нужна команда, чтобы взять вложенный репозиторий, подобный приведенному выше, и создать новый каталог, содержащий только файлы (без ссылок): в данном случае только один файл foo
. Для экономии места , пока не удалите исходный каталог приложения, я хочу файл foo
быть жесткой ссылкой на .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
(очевидно , в реалистичный пример, в хранилище будет много файлов).
Собственные команды git annex для "unannexing" (такие как git annex uninit
) ограничены: в частности, они не очень хорошо поддерживают быстрое превращение репозитория git Annex в простой каталог файлов. Это мотивирует следующую проблему:
Как я могу скопировать каталог с файлами, не ссылаясь на символические ссылки, но жестко ссылаясь на ссылки на символические ссылки?
Я попробовал rsync
--link-dest
, вот так:
rsync -rLptgoD --safe-links --exclude='.git/' --link-dest=annex annex/ copy
Но это не приводит к жестким ссылкам, предположительно потому, что наличие символических ссылок означает, что rsync не знает, на какие файлы жестко ссылаться.