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

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

воскресенье, 26 января 2025 г.

Мерж одного репозитория во второй с переписыванием истории в новом месте

У меня есть 2 репозитория, я хочу смержить их вместе но с сохранением истории обоих. Тот репозиторий, который я собираюсь вмержить должен находиться в определенном месте. Оба репозитория клонированы, второй (вмерживаемый) без remote. Первый находится тут `./main_repo`, второй находится `./second-repo` После операции второй вместе с историей должен появиться тут `./main-repo/src/main/resources/new-place`. Но важно понимать, что я хочу чтобы вся хистори была переписана на новом месте. То есть, чтобы в результирующем репозитории кликая на `Show history for selection` в папке `./main-repo/src/main/resources/new-place` я видел всю историю второго репозитория. 

Это сообщение было промптом в GPT с некоторыми итерациями дополнения, чтобы устранить галлюцинации. А дальше скрипт на память.

cd ./second-repo

git filter-branch -f --index-filter '
  git ls-files -s |
  sed "s#\t#&src/main/resources/new-place/#" |
  GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info &&
  mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
' HEAD

cd ../main-repo

git remote add second-repo ../second-repo

git fetch second-repo

git merge second-repo/master --allow-unrelated-histories

git remote remove second-repo

Профит

вторник, 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
На здоровье!