2014-09-15 3 views
4

Есть ли способ жестко связать все повторяющиеся объекты в папке, содержащей несколько репозиториев GIT?Deduplicate Git Forks на сервере

Объяснение: Я принимаю сервер git на моем сервере компании (Linux Machine). Идея состоит в том, чтобы иметь основной канонический репозиторий, к которому у каждого пользователя нет push-доступа, но каждый пользователь разворачивает канонический репозиторий (клонирует канонический в домашний каталог пользователя, тем самым фактически создавая жесткие ссылки).

/каноническое/Репо /Dev1/Репо (объекты Жесткий связана с/каноническому/Repo, когда первоначально клонировали) /DEV2/Репо (объекты Жесткий связана с/каноническому/Repo, когда первоначально клонировали)

Это все работает нормально. Проблема возникает, когда:

Dev1: Толчки огромный совершить на вилке на сервере (/ Dev1/Repo) DEV2: Выдает, что на его локальной системе, делает его собственные изменения и толкает его к своей вилке на сервере (/ DEV2/Repo)

(Теперь же «огромный» файл находится в обеих разработчиках вилка на сервере, он не создает жесткую ссылку автоматически)

Это съедает мой сервер пространство как сумасшедший!

Как создать жесткие ссылки между объектами, которые дублируются между двумя вилками или каноническими, так что пространство на сервере сохраняется, и каждый разработчик при клонировании из hi fork на своем локальном компьютере получает все данные.

+0

Интересно, можете ли вы связать каталог '.git/objects' в клонах с каноническим. Может быть, попробовать это на фиктивном репо в качестве эксперимента? –

+0

Это не то, что я хочу. В любом случае папка объектов канонических будет отличаться от папки с именами пользователей. Пользовательские вилки будут иметь все объекты канонического, а также некоторые из их собственных объектов. –

+1

Нельзя также вредить сохранению объектов пользователей в каноническом репо. Они были бы «невидимыми» для канонического, если в каноническом отношении нет ссылок на них. –

ответ

2

Наконец-то я нашел решение, которое работает для меня! (Не тестировался в производстве: р)

Благодаря this post, что я решил сделать это:

shared-objects-database.git/ 
foo.git/ 
    objects/info/alternate (will have ../../shared-objects-database.git/objects) 
bar.git/ 
    objects/info/alternate (will have ../../shared-objects-database.git/objects) 
baz.git/ 
    objects/info/alternate (will have ../../shared-objects-database.git/objects) 

Все вилки будут иметь и запись в их файле объектов/информация/их заместителям, что дает относительный путь к репозиторию базы данных объектов.

Важно сделать базу данных объектов репозиторием, потому что мы можем сохранить объекты и ссылки другого пользователя, имеющие репозиторий с тем же именем.

шаги: 1. мерзавец INIT --bare разделяемой объектно-database.git 2. Я запустить следующие строки кода либо каждый раз, когда есть толчок к любой вилке (через пост-ПРИИМИ) или выполнив cronjob

for r in list-of-forks 
     do 
    (
cd "$r" && 
     git push ../shared-objects-database.git "refs/*:refs/remotes/$r/*" && 
echo ../../shared-objects-database.git/objects >objects/info/alternates 
# to be save I add the "fat" objects to alternates every time 
     ) 
done 

Тогда в следующем «мерзавца дс» все объекты в вилках, которые уже существуют в перемежаются будут удалены.

git repack -adl также является вариантом!

Таким образом мы экономим место, чтобы два пользователя, нажимая одни и те же данные на своих вилках на сервере, обменивались объектами.

Нужно установить переменную gc.pruneExpire до never в базе данных общего доступа. Просто быть в безопасности!

Чтобы случайно обрезать объекты, добавьте все вилки в качестве пультов для общего доступа, извлечения, обрезки! Гит сделает все остальное!

Мысли? Предложения?

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