2014-02-06 4 views
1

У меня есть какая структура проекта является следующее:
источник/
../dir1/
../../file1 < - сделать публичные
../../file1
../dir3/< - сделать общедоступным
../dir4/
Один из моих коллег попросил меня поделиться частью кода, который обозначается как «обнародовать».Как опубликовать часть репо?

Так как один экспорт частично репо, поэтому публичный репозиторий будет выглядеть следующим образом:
источник/
../../file1
../dir3/

Единственное решение я думал, что это сделать копию, затем удалить все личные файлы и директории. Но тогда мне нужно будет делать это снова и снова после того, как будет выполнена новая фиксация в первоначальном репо.

Есть ли более элегантный способ?

+0

Да, написать скрипт, который экспортирует файлы (без истории) и удаляет частные каталоги как и ваш в настоящее время делают вручную ... –

+0

'мерзавец archive' будет вашим другом, посмотрите на примеры HTTPS: //www.kernel.org/pub/software/scm/git/docs/git-archive.html – rlegendi

+0

Насколько я знаю 'git archive' делает .tar-файл из всего репо, нужны ли мне только определенные dirs и файлы. – stkubr

ответ

1

Вы можете использовать git-filter-branch.

Для простоты я использую слегка сокращенную версию вашего дела.

Скажем, у вас есть проект с 2 каталога:

  • private, который вы хотите удалить из истории
  • public, что вы хотите сохранить.

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

Теперь запустите

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch private/*' --prune-empty --tag-name-filter cat -- --all

Это удалит все ссылки на private в каждой фиксации.

  • с --index-filter вы можете определить фильтр для выполнения. В нашем случае, git rm --cached --ignore-unmatch private/* удалит из индекса содержимого каталога private

  • --tag-name-filter cat идиоматическое выражение мерзавца переписать тег (см неясной справочной страницы об этой опции). Обратите внимание, что подписи тегов будут удалены.

  • Возможно, применение фильтра приведет к возникновению каких-либо пустых коммитов. Опция --prune-empty удалит их.

  • --all только что сообщает git, чтобы применить фильтр ко всем обязательствам.

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