Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!

Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 
Показаны сообщения с ярлыком history. Показать все сообщения
Показаны сообщения с ярлыком history. Показать все сообщения

вторник, 21 января 2025 г.

Разделяем проект на части вместе с git репозиторием

Есть проект. Хочется его опубликовать. Но часть из негоявляется тайной. Как быть?

Есть ровно 2 тулы, которые позволили мне вчера это сделать:
- BFG Repo-Cleaner
- git filter-branch 

Запишу тут скрипт, который уверен поможет в будущем, когда потребуется снова. 

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

Все команды будем ранать из корня проекта. 

Все команды выполняются в bash.

Первая папка - в ней оставим все кроме папки (всех папок с этим именем):

# файл bfg-1.15.0.jar берем тут https://repo1.maven.org/maven2/com/madgag/bfg/1.15.0/bfg-1.15.0.jar
java -jar bfg-1.15.0.jar --delete-folders folder_to_extract --no-blob-protection
Вторая папка - из нее удалим все, кроме этой папки:
# удалить все удаленные репозитории, в них нет смысла, т.к. появится новый
git remote | xargs -n 1 git remote remove

# удалить все теги
git tag -d $(git tag -l)

# удалить все недокомиченные локальные вресии
git stash & git stash drop 0

# удаление всех веток кроме текущей
git branch | grep -v "$(git symbolic-ref --short HEAD)" | xargs git branch -D
 
# тут указывается полный путь, следовательно придется повторить несколько раз для каждого такого вхождения
# оставить только текущую папку git filter-branch --subdirectory-filter ./src/main/resources/folder_to_extract -- --all # удалить все что осталось после фильтрации git stash & git stash drop 0
На здоровье!

вторник, 15 октября 2019 г.

Разделение git репозитория на два с сохранением истории

Привет!

Сегодня возникла интересная задачка, ее хочу сохранить на память, т.к. уверен, что буду неоднократно использовать ее в будущем. А блог мой - это записная книга.

Предыстория. Есть большой Codenjoy репозиторий со всеми проектами: сервер, игры, клиенты к играм, скрипты для запуска, воспомагательные скрипты и так далее. Есть сообщество контрибюторов, и они делают форки. Иногда в этих форках они что-то полезное фиксят. Мне это надо в моем master. Я прошу их предлагать пулриквесты, но часто в этих пулриквестах содержится много всякого разного, что мне не очень надо в master - скажем изменения правил и дизайна под ивент, фиксы с которыми я не согласен. А так как все делалось наспех (ивент готовится обычно в свободное от работы время), то естественно контрибьютор не работал с веткой и может предложить либо все либо ничего. А мне потом выбирать коммит за коммитом. Брррр...

Задача. Разделить проекты на подпроекты так, чтобы с одной стороны у меня была возможность одной git командой (clone, pull, log, commit, push) работать сразу со всеми проектами; а с другой - принимать только те Pull Request что мне надо фильтруя лишнее. Читать дальше...

четверг, 21 февраля 2013 г.

Как фильтровать svn repo с history

Задача такая - раньше я коммитил все свои Java for fun проекты в отдельный репозиторий. Теперь я хочу, чтобы только один из этих проектов (но со всей историей) остался в результирующем репозитории. Как это сделать? Стал гуглить....

Для начала скажу, что у меня стоит (кроме всего прочего) TortoiseSVN и им был создан репозиторий. Я попробовал установить svnserve и попытался сделать дамп исходного репозитория. На это получил ошибку.
C:\>svnadmin dump D:\JavaForFun\_Repo > all-dump
svnadmin: Expected FS format '2'; found format '4'
В сети говорят - попробуй последнююверсию. Оки! Попробовал то же самое сделать из папки bin установленного VisualSVN Server (вот очень хороший гид, по поторому можно установить себе сервер по вкусу).
Я потоврил команду и на этот раз все получилось.
C:\Program Files (x86)\VisualSVN Server\bin>svnadmin dump D:\JavaForFun\_Repo > all-dump
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.
* Dumped revision 5.
* Dumped revision 6.
Спасибо! В результате образовался в папке текстовый файлик all-dump.
В след за этим я воспользовался командой
svndumpfilter include Snake < all-dump > snake-dump
Что отфильтровала в новый дамп с именем snake-dump только те ревизии, которые содержат Snake. Супер! Осталось только поднять новый репозиторий
svnadmin load --ignore-uuid D:\snake < snake-dump
И вот результат ...
 А вот как выглядят исключенные ревизии..
Дальше я перегнал все хистори в git, который потом залил на git hub. Но это уже другая история...