2013-05-30 2 views
1

В моем репозитории имеется большое количество больших файлов. Это в основном данные (текст). Иногда мне нужно переместить эти файлы в другое место из-за рефакторинга или упаковки.Перемещение большого количества больших файлов в репозитории git

Я использую git mv команды «переименовать» путь к файлам, но это, кажется неэффективным в том, что размере фиксации (фактического размера дифф) очень огромно, так же, как rm, git add

Есть другие способы уменьшить размер фиксации? , или я должен просто добавить их в .gitignore и загрузить как zip-файл в восходящий поток?


Благодарим за ответы.

FYI, следующие серии команд приведет размер файла bar

git mv foo bar 
git commit -m "modify" 
git cat-file -s HEAD:bar 

, из которого я думал, мерзавец сделал rm и add. Не могли бы вы рассказать мне, не связана ли эта информация с фактическим размером или нет?

+0

Что вы подразумеваете под «фиксацией размера»? – michas

ответ

4

По идее, если вы перемещаете файл внутри репозитория Git без изменения содержимого, создание фиксации будет хранить только новые метаданные (объекты дерева a.k.a.) для представления нового местоположения файла. Поскольку контент не изменяется, Git не нужно создавать новый объект blob для хранения содержимого файла. Так что «фиксировать размер» должен быть довольно небольшим.

Поскольку вы говорите, что размер шрифта огромен, я полагаю, что некоторое содержимое файла изменяется вместе с перемещением. Это было бы причиной того, что «размер фиксации» будет огромным.

В обоих случаях, вы можете попробовать уменьшить .git размер каталога с помощью команды git gc --prune --aggressive

EDIT:

git mv foo bar 
git commit -m "modify" 
git cat-file -s HEAD:bar 

Эти команды создают новый коммит, но так как Foo/бар содержимое файла не изменилось, Git не сохранит ничего нового, кроме нового имени файла. На самом деле, в вашем примере git cat-file -s HEAD:foo перед переименованием и git cat-file -s HEAD:bar после этого даст вам тот же результат, так как тот же контент (тот же самый blob в .git/objects). Я думаю, что вы неправильно интерпретируете вещи, которые git делает внутренне. Посмотрите на Git objets, чтобы получить дополнительные пояснения.

Помните, что git отслеживает содержимое, а не файлы.

+0

Благодарим за помощь – nzer0

1

Перемещение предметов в git не изменяет размер хранилища. Каждый файл хранится ровно один раз в репозитории. Вы только увеличите размер репозитория, если начнете изменять эти огромные файлы. - Затем каждая новая версия хранится отдельно.

Посмотрите на git-annex, может быть, это правильно для вас.

Смежные вопросы