Клиент Svn или Git (или плагин) для поиска отсутствующих или поврежденных файлов

Очень часто при использовании Svn (или другой системы контроля версий) возникает проблема, когда программист фиксирует какие-то изменения и ломает сборку. Например, потому что:

  • некоторые файлы были созданы, но не добавлены в систему контроля версий
  • изменения были внесены в одну папку, но программист подумал, что это другая папка и зафиксировал ее
  • файлы в нескольких подпапках были изменены, но зафиксирована только одна папка
  • программист изменил какой-то код, но не скомпилировал его ("потому что это было так легко изменить!")
  • и т.п.

Сломанный билд - это плохо - потерянное время, прерывание работы других людей, и было бы здорово этого избежать. Итак, я ищу какой-нибудь svn (git?) клиент\инструмент\плагин, у которого есть хук "перед фиксацией", где он может проверить несколько основных вещей, например:

  • если папка содержит файлы какого-то типа (скажем, "cpp"), не находящиеся под контролем версий - показать предупреждение
  • если папка содержит файл проекта (из VS или другой IDE), и этот файл проекта содержит некоторые ссылки на файлы, не находящиеся под контролем версий - показать предупреждение
  • если папка содержит файл проекта и файлы какого-либо типа (снова скажем «cpp»), инструмент должен (опционально) попытаться создать этот файл, используя настройки из файла проекта, и показать предупреждение, если файл не компилируется

Я пытался найти такой инструмент - но безуспешно. Теперь у меня есть идея создать такой инструмент самостоятельно (с архитектурой на основе плагинов, чтобы можно было легко добавить поддержку новых типов проектов, типов файлов и типов контроля версий). Но прежде чем приступить к работе над этим инструментом, я хочу спросить - может я что-то упустил и такой инструмент уже существует?

Спасибо


person Ezh    schedule 04.09.2012    source источник
comment
Если вам нужна помощь в создании крючков для этих конкретных случаев, возможно, стоит задать им их собственные вопросы. В противном случае может быть полезно уточнить, что ваш вопрос касается поиска библиотеки готовых хуков или функций, связанных с хуками.   -  person Adam Sharp    schedule 05.09.2012


Ответы (3)


Используйте сервер http://en.wikipedia.org/wiki/Continuous_integration, например Дженкинс. Потому что это не работа для системы контроля версий.

Иногда сборка занимает как минимум несколько минут или даже часов (+тесты). Очень плохая практика заставлять разработчиков делать коммиты так медленно.

Кроме того, не добавленные/не удаленные файлы вообще не должны быть проблемой, пока вы сохраняете рабочую копию в чистоте. Если у вас настроены все .gitignore, предоставлены --assume-unchaged, то git status ничего не покажет после фиксации. Так что просто научите разработчиков заботиться о гигиене рабочих копий, это очень помогает.

person kan    schedule 04.09.2012
comment
Я использую непрерывную интеграцию (CruiseControl), и сломанные сборки на ней являются основной причиной этого вопроса. Полная сборка нашего продукта со всеми подкомпонентами занимает около 1 часа, и очень плохо видеть, что через 1 час сборка была сломана из-за отсутствующих файлов. Вы говорите, что это не работа для системы контроля версий. Почему? Я думаю, что иметь код в багажнике в хорошем состоянии - это основная работа для контроля версий. Возможно, только последняя из моих идей (сборка перед фиксацией) выходит за рамки — и я написал, что это необязательно. Но даже этот билд можно сделать только для новых\измененных файлов- так что будет очень быстро - person Ezh; 04.09.2012
comment
А насчет того, чтобы просто научить разработчиков заботиться о гигиене рабочей копии — конечно. Но всегда лучше позволить компьютеру сделать какую-то работу, которую может сделать компьютер, чем тратить человеческое время. - person Ezh; 04.09.2012
comment
@Ezh Computer явно не может выполнить эту задачу. Разработчик должен делать, а если он этого не делает, то теряет время. Например. если ваша рабочая копия имеет много двоичных файлов, локальных конфигураций, временных файлов и т. д., как git узнает, что только эти два файла на самом деле являются новыми классами, которые вы только что создали и которые необходимо зафиксировать? - person kan; 04.09.2012
comment
Как я уже сказал - по расширениям файлов и по информации из файла проекта. Если какой-то файл .cpp присутствует в проекте Visual Studio и не находится под контролем версий - это определенно нарушит сборку этого проекта. - person Ezh; 05.09.2012

Вы можете настроить хуки перед фиксацией как в Subversion, так и в Git. Эти ловушки в основном представляют собой сценарии оболочки, и вы можете делать с ними как очень простые, так и очень сложные вещи.

Несколько примеров:

  • Простой хук предварительной фиксации Git, который ищет незафиксированные файлы .cpp:

    untracked_cpp_files=$(git ls-files --exclude-standard -o *.cpp)
    if [ -n "${untracked_cpp_files}" ]; then
      echo "Unable to commit: untracked .cpp files found in repository."
      exit 1
    fi
    
  • Вот проект Github, который предоставляет хук перед фиксацией Git для проверки синтаксиса различных языков: https://github.com/shadow7412/hooks.

  • И список некоторых полезных хуков Subversion: http://blog.grimsy.net/2008/07/a-few-svn-pre-commit-hooks/

person Adam Sharp    schedule 04.09.2012
comment
Знаете ли вы какие-нибудь библиотеки хуков-скриптов? Может быть, какой-то инструмент, содержащий вещи, которые я описал в вопросе? - person Ezh; 04.09.2012
comment
Мне удалось найти несколько примеров: google .com.au/search?q=git+hook+%28library+OR+functions%29. К сожалению, я не знаю действительно хорошей канонической библиотеки функций, которую можно было бы использовать в хуках. На самом деле нет предела: все, что вы можете сделать в скрипте (bash, ruby, python, perl и т. д.), вы можете сделать в хуке. - person Adam Sharp; 05.09.2012
comment
@Ezh Я добавил еще несколько ссылок на вещи, о которых я знаю или мог найти с помощью поиска, надеюсь, это поможет. - person Adam Sharp; 05.09.2012

В Git есть такая система:

man githooks

Наслаждаться!

person rks    schedule 04.09.2012
comment
Это способ установить хук - я знаю об этом, в svn тоже есть хуки. Но я говорю о коде в этих хуках, чтобы делать то, что я описал в вопросе. - person Ezh; 04.09.2012