Допустим мы храним данные на некотором удалённом сервере в Bare-репозитории.
Если есть сомнения в честности обслуживающего сервер персонала, или мы опасаемся, что кто-то сопрёт наш проект, можно зашифровать избранные секретные файлы, представляющие особо секретные технологии фирмы и тем самым затруднить клонирование проекта.
Я не буду обсуждать согласование описываемого ниже метода с политикой и лицензионным соглашением бесплатных Git-репозиториев (а ля GitHub) — это дело частностей и вашей совести.
В реализации мы всопользуемся .gitattributes, staging, filters (фильтрами) и главой 7.2 Pro Git Book.
Вот как мы это будем делать.
Существуют два важных нам состояния:

State A.

State B.
State A — когда вы сделали выборку (git checkout) и работаете с вашей рабочей копией — в этот момент файлы должны расшифровываться и находиться в читаемом состоянии. Эта фаза контролируется фильтром stage.
State B — когда изменения ваше рабочей копии готовятся к отправке в репозиторий (git add) — в этот момент файлы должны быть зашифрованы до передачи в хранилище. Эта фаза контролируется фильтром clean.
Обычно фазы stage & clean используются для чего-то более мирного, например форматирование (indent) исходников по вашим вкусам и причёсывание их под принятые в организации стандарты при обратной отправке.
Перед отправкой в хранилище (локальное или удалённое) и для получения читаемых секретных файлов проекта необходимо произвести подготовку на машине разработчика.
Добавляем описание фильтров в ~/.gitconfig:
В домашней директории у нас располагаются два скрипта.
Замените SecurePassword на свой пароль. Выберите на свой вкус метод шифрования из имеющихся в вашей сборке библиотеки OpenSSL. Мы использовали rc5.
~/git_encode.pl:
~/git_decode.pl:
Установите на эти скрипты право исполнения (в командной строке):
В рабочем каталоге подключаем защиту к необходимым файлам.
.gitattributes:
Теперь при отправке в хранилище выбранные файлы будут проходить через шифровщик, а при выборке через расшифровщик.
Чтобы Git не думал каждый раз, что файлы изменились, убедитесь, что шифровщик не «солит» (salted) файлы (используйте опцию -nosalt).
Если есть сомнения в честности обслуживающего сервер персонала, или мы опасаемся, что кто-то сопрёт наш проект, можно зашифровать избранные секретные файлы, представляющие особо секретные технологии фирмы и тем самым затруднить клонирование проекта.
Я не буду обсуждать согласование описываемого ниже метода с политикой и лицензионным соглашением бесплатных Git-репозиториев (а ля GitHub) — это дело частностей и вашей совести.
В реализации мы всопользуемся .gitattributes, staging, filters (фильтрами) и главой 7.2 Pro Git Book.
Вот как мы это будем делать.
Существуют два важных нам состояния:

State A.

State B.
State A — когда вы сделали выборку (git checkout) и работаете с вашей рабочей копией — в этот момент файлы должны расшифровываться и находиться в читаемом состоянии. Эта фаза контролируется фильтром stage.
State B — когда изменения ваше рабочей копии готовятся к отправке в репозиторий (git add) — в этот момент файлы должны быть зашифрованы до передачи в хранилище. Эта фаза контролируется фильтром clean.
Обычно фазы stage & clean используются для чего-то более мирного, например форматирование (indent) исходников по вашим вкусам и причёсывание их под принятые в организации стандарты при обратной отправке.
Перед отправкой в хранилище (локальное или удалённое) и для получения читаемых секретных файлов проекта необходимо произвести подготовку на машине разработчика.
Добавляем описание фильтров в ~/.gitconfig:
[filter "private"]
clean = ~/git_encode.pl
smudge = ~/git_decode.pl
В домашней директории у нас располагаются два скрипта.
Замените SecurePassword на свой пароль. Выберите на свой вкус метод шифрования из имеющихся в вашей сборке библиотеки OpenSSL. Мы использовали rc5.
~/git_encode.pl:
#!/usr/bin/env perl
use strict;
undef $/;
my $data = <STDIN>;
my $tmp = "/tmp/git.encode.$$." . rand() . ".tmp";
local * O;
open(O,">$tmp");
print O $data;
close(O);
print `openssl enc -rc5 -k SecurePassword -nosalt < $tmp`;
unlink($tmp);
~/git_decode.pl:
#!/usr/bin/env perl
use strict;
undef $/;
my $data = <STDIN>;
my $tmp = "/tmp/git.decode.$$." . rand() . ".tmp";
local * O;
open(O,">$tmp");
print O $data;
close(O);
print `openssl enc -d -rc5 -k SecurePassword -nosalt < $tmp`;
unlink($tmp);
Установите на эти скрипты право исполнения (в командной строке):
chmod +x ~/git_encode.pl ~/git_decode.pl
В рабочем каталоге подключаем защиту к необходимым файлам.
.gitattributes:
*.m filter=private
*.h filter=private
*.c filter=private
*.cpp filter=private
Теперь при отправке в хранилище выбранные файлы будут проходить через шифровщик, а при выборке через расшифровщик.
Чтобы Git не думал каждый раз, что файлы изменились, убедитесь, что шифровщик не «солит» (salted) файлы (используйте опцию -nosalt).