Как получить список всех файлов в истории git с размерами

Если вы планируете оптимизировать размер своего git-репозитория с помощью, например, bfg – то просто жизненно необходимо получить список всех файлов в репозитории с их размерами. Из которых вы потом сможете выделить именно те, которые надо удалить из истории вашего проекта. Ниже я приведу вам bash-скрипт который сформирует для вас этот список и отсортирует его по размеру файлов.

git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| sed -n 's/^blob //p' \
| sort --numeric-sort --key=2 \
| cut -c 1-12,41- \
| $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

Удаление каталогов в истории git с помощью BFG

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

Но есть способ обойти это ограничение. Собираем список всех Id-шников у файлов в каталоге и далее этот список скармливаем в BFG на очистку.

git rev-list --all --objects -- path/to/the/directory/to/delete | git cat-file --batch-check='%(objectname) %(objecttype) %(rest)' | grep -Pe '^\w+ blob' | cut -d' ' -f1 > ./to-delete.txt 

java -jar bfg.jar --no-blob-protection --strip-blobs-with-ids ./to-delete.txt

Ну и финальным шагом не забываем пробежаться скриптом для очистки мусора

git reflog expire --expire=now --all && git gc --prune=now --aggressive

The principle is simple: create a list of object IDs to strip, and input that to BFG. This means that if an object is referenced through a different path it will be nuked nonetheless.

  • git rev-list --all --objects -- path/to/the/directory/to/delete
    This will list all objects in the subdirectory referenced in all commits which modify the given path. The format is objectid filepath.You should run this command to check its output matches what you’d expect.
  • git cat-file --batch-check='%(objectname) %(objecttype) %(rest)'
    This will qualify the object with its type. It will turn the previous format objectid filepath into objectid type filepath.
  • grep -Pe '^\w+ blob'
    This will filter out non-blob objects.
  • cut -d' ' -f1 > ./to-delete.txt
    This will extract the object ID and redirect the output into the to-delete.txt file.
  • java -jar bfg.jar --no-blob-protection --strip-blobs-with-ids ./to-delete.txt
    This runs BFG, giving it the list of objects to remove.

git: нормализация lrlf

Если вы решили переконвертировать ваш репозиторий, убрав из файлов символы переноса каретки, то можно использовать https://rtyley.github.io/bfg-repo-cleaner/. Он работает намного быстрее, чем обычный filter-branch.

Итак, склонируем наш репозиторий с параметром –mirror

git clone –mirror https://github.com/voiplab/mysuperrepo
echo “regex:\r(\n)==>$1” > replacements.txt
java -jar bfg-1.13.0.jar –no-blob-protection –replace-text replacements.txt mysuperrepo.git

Запускаем провреку репозитория

Меняем origin если хотим запушить в новое место

git push origin -all

AutoMerge Script for Bitbucket.org

В рамках автоматизации одного проекта написал скрипт на PowerShell, который мержит ветки используя bitbucket API. Огромный плюс использования этого скрипта для автоматического мержа в том, что вам не нужно вытягивать исходники. Все делается на стороне bitbucket. Не все идеально, где то можно оптимизировать, но он работает =)

https://github.com/voiplab/Misc/blob/master/RemoteMergeBitbucket.ps1