2009-12-10 4 views
17

Почти любая IDE создает множество файлов, которые не имеют ничего общего с разрабатываемым приложением, они генерируются и поддерживаются средой IDE, поэтому он знает, как создать приложение, где находится репозиторий управления версиями и т. Д.Что поставить под контроль версий?

Должны ли эти файлы храниться под контролем версий вместе с файлами, которые действительно имеют какое-то отношение к приложению (исходный код, файлы конфигурации приложения ...)?

В некоторых IDE, если вы создаете новый проект, а затем импортируете его в репозиторий управления версиями, используя клиент/команды управления версиями, встроенные в среду IDE, все эти файлы отправляются в респиратор. И я не уверен, что это правильно: что два разных разработчика, работающие в одном проекте, хотят использовать две разные IDE?


Я хочу, чтобы этот вопрос агностик избегая ссылок на какой-либо конкретный IDE, язык программирования или управления версиями системы. Так что этот вопрос не является точно такой же, как они:

+0

См. Также http://stackoverflow.com/questions/116121/do-you-keep-your-project-files-under-version-control/119377#119377 – VonC

ответ

18

Эмпирические правила:

  1. Включать все, что имеет влияние на результат сборки (опции компилятора, файловые кодировки, ASCII/двоичных установок и т.д.)
  2. включает в себя все, чтобы сделать возможным, чтобы открыть проект с чистого проверки и возможность компиляции/запуска/тест/отладки/развернуть без дальнейшего ручного вмешательства
  3. не включать файлы, которые содержат абсолютные пути
  4. Избегайте включая персональные предпочтения (размер вкладок, цвета, положения окон)

Следуйте правилам в этом заказе.

[Обновить] Всегда есть вопрос, что должно произойти с сгенерированным кодом. Как правило, я всегда ставил их под контроль версий. Как всегда, принимайте это правило с солью.

Мои причины:

Versioning сгенерированный код кажется пустой тратой времени. Это правильно? Я могу вернуть его одним нажатием кнопки!

Действительно?

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

И даже если бы вы могли, могли бы вы когда-нибудь быть уверены, что ничего не пропустили?

Итак, с одной стороны, создание сгенерированного кода под управлением версии имеет смысл, поскольку делает его мертвым легко сделать то, что предназначено для VCS: вернитесь во времени.

Также это позволяет легко увидеть различия. Генераторы кода также не работают.Если я исправлю ошибку и создаю 150 000 файлов, это очень помогает, когда я могу сравнить их с предыдущей версией, чтобы увидеть, что а) ошибка исчезла и b) ничего еще неожиданно изменилось. Это неожиданная часть, о которой вам следует беспокоиться. Если вы этого не сделаете, сообщите мне, и я обязательно буду работать в своей компании. :-)

Основная причина боли в генераторах кода - стабильность. Этого не происходит, когда генератор кода просто выплевывает случайный беспорядок байтов каждый раз, когда вы запускаете (ну, если вы не заботитесь о качестве). Генераторы кода должны быть стабильными и deterministic. Вы запускаете их дважды с одним и тем же входом, а выход должен быть идентичным до младшего значащего разряда.

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

Сгенерированный код, который я, возможно, не поставил под контроль версий, будет документацией. Документация - это несколько мягкая цель. Это не имеет значения, когда я регенерирую неправильную версию документов (скажем, она имеет несколько опечаток более или менее). Но для релизов я мог бы это сделать так, чтобы я мог видеть различия между релизами. Может быть полезно, например, убедиться, что заметки о выпуске завершены.

Я также не проверяю файлы JAR. Поскольку у меня есть полный контроль над всей сборкой и полная уверенность в том, что я смогу вернуть любую версию источников за минуту, и я знаю, что у меня есть все необходимое для ее создания. без какого-либо дополнительного ручного вмешательства., зачем мне для исполняемых файлов? Опять же, было бы целесообразно разместить их в специальном репо-релизе, но затем лучше сохранить копию последних трех лет на веб-сервере вашей компании для загрузки. Подумайте: сравнивать бинарные файлы сложно и много не говорит.

+1

Я бы добавил два правила «Избегайте всего, что может быть создано из других включенных файлы "и" Избегайте изменений, которые часто и автоматически меняются " – sfussenegger

+1

Правила 1 и 2 полностью ошибочны. Они применяются к дистрибутивному архиву, но НЕ к VCS. –

+6

Я действительно согласен с 1 и 2 100%. Очень важно иметь возможность получить копию источника, типа «ant run» или somesuch, и быть в курсе. Я даже включу источник или двоичный файл библиотеки, от которой я зависим. Я полностью доволен этим подходом; это намного лучше, чем требовать от всех разработчиков загрузки и установки чего-либо каждый раз, когда есть новая зависимость. –

2

Anythi ng, который был бы разрушительным, если бы он был потерян, должен находиться под контролем версий.

+0

«... должно быть под контролем версий» вы сказать? :) – mmutilva

+0

@Toto - Совершенно верно. –

3

Это где build automation и строить файлы бывают.

Например, вы можете создать проект (две разработчики потребуется такое же программное обеспечение сборки очевидно), но тогда они могли бы, в свою очередь использовать две разные IDE.

Что касается «мусора», который генерируется, я предпочитаю игнорировать большинство, если это так. Я знаю, что это означает, что язык не агностик, но рассмотрим Visual Studio. Он генерирует пользовательские файлы (пользовательские настройки и т. Д.), Это не должно быть под контролем источника.

С другой стороны, файлы проекта (используемые процессом сборки), безусловно, должны. Я должен добавить, что если вы находитесь в команде и все согласны с IDE, тогда проверка в определенных файлах IDE прекрасна, поскольку они являются глобальными, а не специфичными для пользователя и/или не нужны.

Эти другие вопросы хорошо помогают объяснить, что должно и не должно быть проверено в контроле источника, поэтому я не буду их повторять.

2

По-моему, это зависит от проекта и окружающей среды. В среде компании, где все используют одну и ту же среду IDE, имеет смысл добавить файлы IDE в репозиторий. Хотя это немного зависит от IDE, поскольку некоторые из них включают абсолютные пути к вещам.

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

+0

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

+0

В зависимости от языка и IDE вы используете эти файлы: build isntructions, build configurations, которые могут быть полезны разработчикам для использования аналогичных настроек. – johannes

5

Я думаю, что лучше всего поставить что-либо под контролем версий, что поможет разработчикам быстро начать работу, игнорируя все, что может быть сгенерировано с помощью средств IDE или сборки (например, плагин Maven's eclipse генерирует .project и .classpath - нет необходимости чтобы проверить их). Особенно избегайте часто изменяющихся файлов, которые не содержат ничего, кроме пользовательских настроек, или конфликтуют между IDE (например, другая среда IDE, которая использует .project, как это делает eclipse).

Для пользователей eclipse мне особенно удобно добавлять стиль кода (.settings/org.eclipse.jdt.core.prefs - автоматическое форматирование при включенном сохранении), чтобы получить последовательно отформатированный код.

3

Все, что может быть сгенерировано автоматически из файлов конфигурации + источника, не должно находиться под контролем версии! Это только создает проблемы и ограничения (например, тот, который вы указали), используя два разных файла проекта разными программистами).

Его правда не только для «нежелательных файлов» IDE, но и для промежуточных файлов (например, .pyc в python, .o в c и т. Д.).

0

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

Что-нибудь еще? Храните его где-то в другом месте. Разработчики должны как можно больше выбирать свою рабочую среду.

0

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

Что касается сгенерированных файлов IDE (я предполагаю, что это те, которые не генерируются во время процесса сборки, такие как файлы решений для Visual Studio) - хорошо, я думаю, это будет зависеть от того, работаете ли вы в одиночку. Если вы работаете в одиночку, то идите дальше и добавляйте их - они позволят вам вернуть настройки в решении или что бы вы ни делали. То же самое касается других не-подобных файлов. Однако, если вы сотрудничаете, тогда моя рекомендация не является большинством файлов, сгенерированных IDE, как правило, характерна для пользователя, так как они работают на вашей машине, но не обязательно на других.Следовательно, вам может быть лучше не включать файлы сгенерированных IDE в этом случае.

tl; dr Вы должны поместить большинство вещей, которые относятся к вашей программе, в управление версиями, исключая зависимости (такие вещи, как библиотеки, графика и звук, должны обрабатываться какой-либо другой системой управления зависимостями). Что касается вещей, непосредственно созданных IDE - ну, это будет зависеть от того, работаете ли вы в одиночку или с другими людьми.

Смежные вопросы