Ответ 1
Взгляните на часть управления версиями для одного разработчика в ответе на вопрос Разница между GIT и CVS" в StackOverflow. Некоторые из этих проблем по-прежнему применяются также к Subversion в сравнении с GIT (или другим распределенным VCS: Mercurial, Bazaar или менее известным: Monotone, Darcs), даже если Subversion - это улучшение по сравнению с CVS.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я использую GIT (поэтому я предвзятый) и знаю Subversion только из документации (и других ресурсов), никогда не используя ее самостоятельно. Возможно, я ошибаюсь в возможностях Subversion.
Ниже приведен список различий между GIT над Subversion для одного разработчика на одной машине (отдельная учетная запись):
-
Настройка хранилища. GIT хранит репозиторий в каталоге
.git
в верхней директории вашего проекта. Запуск нового проекта из неверсифицированного дерева файлов так же просто, как сделать "git init" в верхней директории вашего проекта (а затем, конечно, "git add." ), Чтобы добавить файлы и, например, "git commit -m 'Первоначальная фиксация' 'для создания первого коммита).В Subversion (в любой централизованной системе контроля версий) вам необходимо настроить центральный репозиторий (если вы этого не сделали раньше), используя "svnadmin create" (ну, вам нужно сделать это только один раз). Затем вам нужно импортировать файлы в Subversion, используя "svn import" (или "svn add" )... Но обратите внимание, что после завершения импорта исходное дерево не преобразуется в рабочую копию. Чтобы начать работать, вам все равно нужно "svn checkout" создать новую рабочую копию дерева.
-
Метаданные репозитория и репозитория. GIT хранит как репозиторий (т.е. информацию об изменениях и ветких и т.д.), так и метаданные репозитория (например, ваша личность, список игнорируемых файлов, какая ветка в настоящее время проверяется) в каталоге
.git
в верхнем каталоге ваших проектов.Subversion хранит репозиторий в отдельной области, которую вы должны поставить для этой цели, и сохраняет метаданные репозитория (например, где центральный репозиторий, идентификатор, используемый для обращения в центральный репозиторий, и я также думаю, что такие свойства, как
svn:ignore
), хранятся в.svn
в каталоге каждого каталога вашего проекта. (Обратите внимание, что Subversion хранит чистую копию вашего заказа, чтобы иметь "svn status" и "svn diff" ) -
Именование версий/номеров версий. Subversion использует глобальные идентификаторы ревизий в виде одной версии с указанием номера, поэтому вы можете, например, обратиться к r344, редакция 344). Subversion также поддерживает несколько символических спецификаций пересмотра: HEAD, BASE, COMITTED, PREV.
В GIT каждая версия проекта (каждая фиксация) имеет свое уникальное имя, заданное 40 hexdigits SHA-1 id; Обычно для идентификации фиксации достаточно первых 7-8 символов (вы не можете использовать простую схему нумерации для версий в системе управления распределенной версией, для которой требуется центральный авторитет нумерации). Но GIT предлагает также другие типы спецификаций ревизий, например
HEAD^
означает родительский элемент текущей фиксации,master~5
означает обратно 5 предков назад (в прямой строке первого родителя) из верхней фиксации в ветки "ведущий",v1.6.3-rc2
может означать ревизию с тегамиv1.6.3-rc2
.См. также Множество разных спецификаторов ревизий в блоге Элайджа Ньюрена.
-
Легкое разветвление и слияние. В GIT создание и объединение ветвей очень просто; GIT запоминает всю необходимую информацию сам по себе (поэтому объединение ветки происходит так же, как "git merge branchname" )... это должно было быть, потому что распределенное развитие, естественно, приводит к нескольким ветвям. GIT использует эвристическое определение переименования на основе сходства, поэтому при слиянии оно может иметь дело с случаем, когда одна сторона переименовала файл (и другие подобные случаи, связанные с переименованием). Это означает, что вы можете использовать рабочий процесс ветвей тем, т.е. Создать отдельную функцию в нескольких шагах в отдельной ветки функций.
Филиалы имеют необычную реализацию в Subversion; они обрабатываются соглашением об именах: ветка представляет собой комбинацию ревизий в глобальном репозитории, которые существуют в определенном пространстве имен. Создание новой ветки осуществляется путем копирования существующего набора файлов из одного пространства имен в другое, записанного как сама ревизия. Subversion упростил создание новой ветки... но до версии 1.5 вам пришлось использовать дополнительные инструменты, такие как SVK или svnmerge, чтобы они могли легко сливаться. Subversion 1.5 вводит свойство
svn:mergeinfo
, но даже тогда слияние немного сложнее, чем в Git; также вам нужно использовать дополнительные опции для показа и использования информации отслеживания слияния в таких инструментах, как "svn log" и "svn wame". Я слышал, что он не работает корректно в более сложных ситуациях (criss-cross merge) и не может в настоящее время переименовывать (в этом случае есть даже вероятность молчаливой коррупции). См. Также (например) этот пост в GIT списке рассылки Дмитрия Потапова, объясняя предполагаемый прецедент дляsvn:mergeinfo
и его (текущих) ограничений. -
Пометка. В тегах GIT неизменяемый, могут иметь связанный с ними комментарий и могут быть подписаны с использованием подписи PGP/GPG (и проверены), Они создаются с использованием тега git. Вы можете ссылаться на ревизию с использованием имени тега.
В тегах Subversion используется такое же пространство имен типа path_info , что и ветки (рекомендуемое соглашение
svnroot/project/tags/tagname
), и они не защищены от изменения. Они создаются с использованием "svn copy". Они могут иметь комментарий, связанный с [фиксацией, создающей тег]. -
Расширение ключевых слов. GIT предлагает очень, очень ограниченный набор ключевых слов по сравнению с Subversion (по умолчанию). Это происходит из-за двух фактов: изменения в GIT для каждого репозитория, а не для файла, а GIT избегает модификации файлов, которые не менялись при переключении на другую ветвь или переименование в другую точку истории. Если вы хотите вставить номер версии с помощью Git, вы должны сделать это, используя свою систему сборки, например. следуя exaple GIT -VERSION-GEN script в источниках ядра Linux и в источниках GIT. Существует также
'ident'
gitattribute, который позволяет развернуть ключевое слово $Id $до идентификатора SHA-1 содержимого файла (не идентификатор коммита).Оба GIT и Subversion делают расширение ключевого слова только по запросу.
-
Двоичные файлы. Оба GIT и Subversion правильно обрабатывают двоичные файлы. GIT обнаружение двоичного файла с использованием аналогичного алгоритма, используемого, например, GNU diff, если только не переопределяется на основе каждого маршрута с использованием gitattributes. Subversion делает это несколько иначе, обнаруживая тип файла во время добавления файла и устанавливая свойство
svn:mime-type
, которое вы затем можете изменить. Оба GIT и Subversion могут выполнять преобразование символов конца строки по запросу; GIT дополнительно имеет опциюcore.safecrlf
config, которая предупреждает и предотвращает необратимое изменение (все CR для всех CRLF обратимы, смешанные CR и CRLF не обратимы). -
Игнорирование файлов. GIT сохраняет шаблоны игнорирования с использованием файла in-tree
.gitignore
, который может быть установлен под управлением версиями и распределен; он обычно содержит шаблоны для продуктов сборки и других сгенерированных файлов и в файле.git/info/excludes
, который обычно содержит шаблоны игнорирования, специфичные для пользователя или системы, например. игнорировать pattersn для файлов резервных копий вашего редактора. GIT шаблоны применяются рекурсивно, если только patter не содержит разделитель каталога, то есть символ косой черты '/', тогда он привязан к каталогу.gitignore
file; в верхний каталог для.git/info/excludes
. (Существует также переменная конфигурацииcore.excludesfile
, эта переменная может существовать в конфигурационном файле для пользователя~/.gitconfig
и указывать на файл игнорирования каждого пользователя).Subversion использует опцию конфигурации
global-ignores
(которая обычно применяется к определенному компьютеру или конкретному пользователю компьютера) и свойство "svn:ignore
" в каталогах с версией SVN. Однако, в отличие от опцииglobal-ignores
(и в.gitignore
), шаблоны, найденные в свойстве "svn:ignore
", применяются только к каталогу, в котором это свойство задано, а не к любому из его подкаталогов. Кроме того, Subversion не распознает использование префикса!
для шаблона как механизма исключения. -
Изменение коммитов.распределенный VCS, такой как публикация публикации GIT, не зависит от создания коммита, можно изменить (отредактировать, переписать) неопубликованную часть истории без неудобства другим пользователям. В частности, если вы заметили опечатку (или другую ошибку) в сообщении фиксации или ошибку в фиксации, вы можете просто использовать "git commit -amend". (Примечание: технически это повторное создание фиксации, а не изменение существующего фиксации, измененный фиксатор имеет другой идентификатор).
Subversion позволяет только модифицировать сообщение фиксации после факта, изменяя соответствующее свойство.
-
Инструменты. С одной стороны GIT предлагает более богатый набор команд. Одним из наиболее важных является "git bisect", который можно использовать для обнаружения фиксации (ревизии), которая ввела ошибку; если ваши коммиты небольшие и автономные, должно быть довольно легко обнаружить, где ошибка.
С другой стороны, Subversion потому, что существует дольше, возможно, имеет более широкий набор сторонних инструментов и поддержку Subversion в инструментах, чем Git. Или, по крайней мере, более зрелые. Особенно в MS Windows.
И есть еще одна проблема, которая может быть очень важна позже:
-
Публикация репозитория. Если (когда?) в какой-то момент вы захотите поделиться своим репозиторием, превратив его из проекта с одним человеком, разработанного на одном домашнем компьютере, чему-то другому способствовать, с GIT так же просто, как создание пустого репозитория на сервере или на одном из существующих сайтов GIT хостинга/хостинга программного обеспечения с поддержкой GIT (например http://repo.or.cz, GitHub, Gitorious, InDefero; больше - также для других DVCS - указаны в который отвечает), а затем выкладывая проект в этот публичный репозиторий.
Я думаю, что это сложнее с Subversion, если вы не начинаете с сайта хостинга с поддержкой Subversion (например, SourceForge) с самого начала, если только вы не хотите сохранять существующую историю изменений. С другой стороны, например, в Google Code предлагается использовать инструмент svnsync (часть стандартного дистрибутива Subversion), как описано в Google Products > Проект Хостинг (фронт Освобождения Данных).
Посмотрите также на http://whygitisbetterthanx.com/ сайт.