Сжатие истории репозитория GIt

Удаленные серверы Git, как правило, накладывают ограничения на размер репозитория. И со временем возникает необходимость очистки истории от коммитов с большими файлами.

По материалам статьи на сервисе Bitbucket

Удобнее воспользоваться скриптом BFG, правда он требует наличия установленной среды исполнения java , которая устанавливается достаточно легко.

Перед манипуляциями рекомендуется сделать копию репозитория

$ git clone --mirror git://example.com/some-big-repo.git

И после установки java-runtime можно начинать

Я переписал скрипт bfg.jar в каталог репозитория и выполнил команду

java -jar bfg.jar --strip-blobs-bigger-than 100M .

Точка сообщает скрипту, что репозиторий находится в текущем каталоге

Кроме всего прочего скрипт выдал следующую информацию о найденных и удаленных из истории файлах:

Deleted files ————- Filename Git id ————————————————— arduino-1.8.10-windows.zip | 645824b8 (198,0 MB) arduino-1.8.8.zip | 2143574c (179,0 MB) arduino-1.8.9-linux32.tar.xz | 36b63692 (118,4 MB)

Однако, скрипт не удаляет эти данные из истории физически, чтобы перестроить индексы git и «собрать мусор», нужно выполнить в консоли git:

$ cd <каталог репозитория>
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

И затем:

$ git push --all --force

для отправки произведенных изменений на сервис Git

Создание удаленного репозитория из папки проекта с помощью Git

Создание удаленного репозитория из папки проекта с помощью Git

Загрузка и установка клиента Git

Предпочитаю portable версии программ, это касается и клиента Git. Его можно найти на просторах, или взять здесь. Пароль к архиву 12345. Нужно просто скачать и распаковать архив в каталог диска по желанию.

Я держу portable версии программ на d:/admin/prog и при загрузке новых обновляю этот каталог на «покете», так что самое нужное всегда с собой.

Распаковываем, например, в d:/admin/Prog/GitPortable

Смотрите, чтобы не получилось d:/admin/Prog/GitPortable/GitPortable/ 🙂

В итоге, если все сделано аккуратно, версия программы с графическим интерфейсом расположится в каталоге D:\admin\Prog\GitPortable\GitPortable.exe

А лучший в мире вариант с управлением из командной строки — в D:\admin\Prog\GitPortable\App\Git\git-bash.exe и можно просто сделать ярлык на запуск на рабочем столе.

Выделить файл git-bash.exe в проводнике и с нажатой правой кнопкой мыши потащить на рабочий стол и бросить. Появится контекстное меню — выбрать Создать ярлык.

Однако…

Результат выполнения команды dir
Результат выполнения команды dir

То есть, текущим в bash консоли Git оказался каталог самой программы, а для работы нам нужно, чтобы текущим был локальный каталог нашего будущего репозитория  (папка нашего проекта).

Немножечко командной строки

Переходим куда нужно, например, наш проект находится в d:/repo/1sprog, тогда вводим команду

cd d:/repo/1sprog

Если путь содержит пробелы, то его нужно заключить в двойные кавычки, например,

cd «d:/Моя любимая папка/1sprog»

Чтобы не вводить команду выше, а после запуска сразу «оказаться» в нужной папке, можно поправить  параметр Рабочая папка нашего ярлыка для git-bash.

Свойства ярлыка git-bash
Свойства ярлыка git-bash

Посмотрим что есть в этой папке проекта с точки зрения git

Вводим команду dir

dir

У меня тут вот что

Результат команды DIR
Результат команды DIR

И вот какая штука. При создании репозитория в этой папке, если не предпринимать никаких мер, по-умолчанию в него будут включены все имеющиеся в папке проекта подкаталоги и файлы. Соответственно, они все будут затем перенесены в удаленный репозиторий и будут реплицироваться при каждой синхронизации. Если интернет мобильный, то чем меньший объем проходит по каналу связи, тем лучше!?.

Например, мы видим на предыдущем рисунке файлы, которые являются побочным результатом компоновки и компиляции программы — это файлы *.obj, *.map и, по большому счету *.hex (исполняемый файл, в данном случае прошивка для контроллера). И есть только пара файлов, которые действительно ценны —   7segement.asm и 7segement.inc

Более того, на удаленном сервере совершенно нечего делать файлу passwords.txt

Исключение некоторых файлов — файл .gitignore

Точка в имени файла присутствует в самом начале, это не опечатка!

Для моего примера содержимое файла .gitignore может быть таким:

.idea/

*.obj

*.map

*.hex

passwords.txt

Каталог .idea/ исключается весь, такой знак подает клиенту git наклонная черта сразу в конце имени каталога, без пробела. Этого каталога не было в выводе по команде dir, это каталог, к котором среда разработки (в данном случае PhpStorm) хранит свои временные и настроечные файлы для данного проекта. Он совершенно не нужен никому на сервере Git, даже мне — исключаем весь.

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

Каждое исключение должно располагаться на новой строке.

Сделать можно в Блокноте, а потом при «сохранении как…» в нашу папку проекта дать имя .gitignore, при этом не забыв выбрать тип файла «все файлы», иначе блокнот «приклеит» расширение TXT.

Создание .gitignore
Создание .gitignore
Минуточку терпения, почти все готово!

К стати, когда надоедят танцы с проводником Windows, блокнотом и прочими бубнами можно поставить Far manager и жить станет проще, жить станет веселей!

Я брал стабильную сборку, MSI-пакет установки.

Инициализация репозитория

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

Прим. Все команды выполняются в консоли git-bash

1) Инициализация локального репозитория:

git init

Все проходит «молча», но положительный результат виден по появлению скрытого подкаталога .git в текущей папке. Чтобы включить показ скрытых файлов и папок в проводнике Windows, нужно включить следующие опции в пункте меню Вид (скрин из 10 версии Винды). За одно включим и показ расширений, тоже удобная вещь.

show-hidden-files
show-hidden-files

В Far manager переключение видимости скрытых файлов и папок происходит по Ctrl-H

2) Создание абсолютно пустого (без readme, без .gitignore) репозитория на bitbucket.org через веб-сайт
Создание нового репозитория на bitbucket
Создание нового репозитория на bitbucket
АБСОЛЮТНО пустого
АБСОЛЮТНО пустого

у меня последний экран выглядел так

Создан абсолютно пустой репозиторий
Создан абсолютно пустой репозиторий
3) Далее — подключение удаленного репозитория к локальному

Все, что написано далее, не учитывает нюансов, которые добавляются при использовании Линукс и/или стороннего хостинга (мне не удалось подключиться по https). В личном профиле на bitbucket в разделе ssh-ключей имеется ссылка на подробнейшую инструкцию как организовать подключение по ssh.

Строка адреса (https://mickle-iv@bitbucket.org/mickle-iv/1sprog.git) взята из формы, выданной bitbucket в результате создания репозитория.

git remote add origin https://mickle-iv@bitbucket.org/mickle-iv/1sprog.git

4) Добавляем файлы проекта в индекс (между add и точкой —  пробел)

Перед добавлением можно дать git status и посмотреть какие файлы клиент git предложит добавить. Посмотрите, в этом списке не должно быть файлов и папок, указанных в .gitignore

Прим. Между add и точкой есть пробел

git add .

5) Делаем коммит

git commit -m ‘My initial commit’

Дальше нужно сделать первый push и тут возникло 2 варианта, я использовал первый вариант, предложенный bitbucket

1 вариант от bitbucket.org

git push -u origin master

 

2. вариант, предложенный самим клиентом git

git push —set-upstream origin master

И вуаля!

success
success

 

Если постигла неудача при инициализации и увязке локального и удаленного репозиториев — не беда. Просто сносим локальный подкаталог .git в нашей папке проекта на фиг (для уверенности можно снести и создать заново новый пустой репозиторий на bitrbucket.org) и аккуратно повторяем все операции, начиная с пункта 1) раздела «Инициализация репозитория».

Как удалить репозиторий на bitbucket:

Удаление репозитория на bitbucket.org
Удаление репозитория на bitbucket.org