Можно ли клонировать хранилище в git и не хранить все изменения?
С не так уж много дисциплины, вы можете использовать --reference
репозитории держать только один депо по всему сайту для крупных, стабильных частей РЕПО, где «Сайт» определяются как «машина с доступом к общей долевой файловой системе» ,
Чтобы сделать его безопасным в качестве общей файловой системы:
сделать голую репо, публикующий только стабильные ссылки. Самый простой способ - сделать полный клон, а затем удалить все неустойчивые.
git clone
--bare
u://r/l/to/real/upstream
/path/to/reference/repo
cd !$
git tag -d
all the tags that have even a whiff of instability about them
git branch -D
every branch
git rev-parse
any-tag
> HEAD
Используйте этот репо в качестве ссылки.При клонировании реального вверх по течению,
git clone --reference /path/to/reference/repo u://r/l/to/real/upstream
И это действительно все, что нужно использовать его в доме. Часть дисциплины заключается в том, что вы должны быть уверены, что файловая система с вашим депо на ней всегда доступна для чего-либо, ссылаясь на нее, и что никакие изменения в вашем депо никогда не оставляют неопознанную фиксацию. chmod -R a-w
сделает это красиво.
Если люди клонировать этот путь к их ноутбукам и взять их где-нибудь без доступа к депо, они должны разъединить их клоны из депо первыми:
# disconnect from depot:
git repack -Ad \
&& rm .git/objects/info/alternates
Примечание:
Для действительно недоукомплектованные ноутбуки и действительно большие РЕПО, переупаковка может быть неудобной. Альтернативный способ:
# disconnect from depots, minimal cpu load for underpowered localhost:
cp -r $(cat .git/objects/info/alternates) .git \
&& rm .git/objects/info/alternates
Это также можно упаковать «только то, что вам нужно» для поездки дороги с git pack-objects
и git rev-list
. Вот один из способов сделать это:
# pack up what I have locally, mark it as reliably-present:
git repack -l
for pack in .git/objects/pack/*.pack; do
touch $pack.keep
done
# pack up everything I still don't have that might actually be useful
# no need to list tags that are ancestors of other tags here:
git rev-list --objects --all ^tag-I-dont-need ^another ^etc \
| git pack-objects --honor-pack-keep .git/objects/pack/pack
mv .git/objects/info/alternates{,.inaccessible}
# let git gc at what's here when needed
rm .git/objects/pack/pack-*.keep
и по возвращении в склад, поместите альтернативный файл обратно.
«Мой репозиторий - десятки ГБ» - я думаю, что это проблема. Git предназначен для хранения * кода * (или аналогичного), по-видимому, все, что вы храните, нигде не приближается к коду! –
@ OliCharlesworth Это правда, что это не строго код, но мы нуждаемся в нем под контролем версий. – jlconlin
Вы можете использовать ссылочные репозитории или как «объекты/информацию/альтернативы» более низкого уровня, чтобы сохранить одну копию старой истории на каждом сайте (сайт, на котором компьютеры используют как минимум надежную общую файловую систему). Создайте голый репозиторий, чтобы получить старые теги, которые не будут меняться, добавьте путь '--reference/to/that/repo' к будущим клонов, которым не нужен быстрый доступ. Клоны, даже тех клонов, которые не задают -reference, получают полные копии, как обычно. – jthill