Недавно я закончил вторую статью из обзоров фреймворков с открытым исходным кодом для ревёрсеров: Radare2 и Viper. Первая была опубликована в журнале “Хакер” за Сентябрь 2014, а вторая будет в номере за Ноябрь. В связи с этим и родился этот пост. Хотя точнее будет назвать небольшой заметкой для себя, чтобы не забывать, так как я не часто отправляю какие-то патчи или улучшения, да и о внесение своих доработок в open source проекты было уже сказано не раз. Все команды будут указаны на примере моего недавнего патча для одного из фреймворков.

У каждого проекта на github в правом углу есть 3 кнопки.

Fork project

Из них нам нужна 3-я - “Fork”. Кликаем по ней и уже в нашем github-аккаунте появляется этот проект. Далее клонируем уже свой проект к себе на машину:

~/soft# git clone https://github.com/dukebarman/viper.git
~/soft# cd viper/

Создаем новую ветку разработки под именем которой будут проходить все наши изменения:

~/soft/viper# git checkout -b fix-mistypes-vs-apk

Далее патчим/добавляем/удаляем файлы и указываем путь для git, в котором происходили изменения:

~/soft/viper# git add modules/

Коммитим и пушим изменения:

~/soft/viper# git commit -m "Fix mistypes in apk and virustotal modules"
[fix-mistypes-vs-apk be8d11d] Fix mistypes in apk and virustotal modules
2 files changed, 2 insertions(+), 2 deletions(-)
~/soft/viper# git push origin fix-mistypes-vs-apk

Теперь делаем Pull Request кнопкой “New Pull Request” из страницы нашего github-проекта в настоящий, добавив описание/скриншоты/видео. После чего на нашей созданной странице из списка “Pull requests” реального проекта общаемся с разработчиком до принятия доработок, в некоторых случаях иногда что-то исправляя и отправляя изменения через команду commit:

~/soft/viper# git checkout fix-mistypes-vs-apk
Patching!Patching!Patching!
~/soft/viper# git add modules/
~/soft/viper# git commit -m "Fix"

После закрытия этой страницы ветку из своего репозитория нужно удалить:

~/soft/viper# git checkout master
~/soft/viper# git branch -d fix-mistypes-vs-apk

Так как мы работаем с проектом из своего репозитория, то периодически (особенно перед добавлением своего функционала) нужно переносить изменения из реального. Для этого есть набор команд рекомендуемых в некоторых гайдах, смысл которых создать ветку для нашего проекта, которая будет указывать на репозиторий реального, и обновлять её:

~/soft/viper# git remote add upstream  git://github.com/botherder/viper.git
~/soft/viper# git fetch upstream
~/soft/viper# git checkout -b upstream-master
~/soft/viper# git checkout master
~/soft/viper# git fetch
~/soft/viper# git rebase upstream-master 
~/soft/viper# git push origin master

Для последующих обновлений пользуемся командой:

~/soft/viper# git fetch upstream
~/soft/viper# git checkout master
~/soft/viper# git merge upstream/master

Для более комфортной работы можно:

  • добавить вывод в терминал слева от логина название ветки, в которой в данный момент работаешь
  • воспользоваться IDE. Например, в продукты от JetBrains по-умолчанию входит модуль для работы с Git

Так что не стесняемся вносить свой вклад в развитие ПО, тем более, если оно помогает нам в работе ;-)

####UPD На старом добром HabraHabr выложили статью о том, как получать ещё и деньги за патчи в opensource-продукты