Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID
2017-04-20 01:59:02
+ развернуть текст сохранённая копия
Для некоторых современных программистов не существует систем контроля версий кроме Git, но на практике Subversion всё ещё востребован, а Mercurial имеет своих ярых сторонников. Быстрый поиск в подкрепление.
В результате DevOps'ы не монопроектных компаний встречаются с необходимостью автоматизировать работу с весьма разными системами. При этом у каждой есть свои нюансы и неизбежно появляются скрытые ошибки в сценариях, выстреливающие в самый неподходящий момент. Возникает потребность в предсказуемом поведении с минимальной "гибкостью", а не пёстрым букетом возможностей.
Читать дальше →
Тэги:
devops,
futoin,
git,
github,
mercurial,
open,
scm,
source,
subversion,
svn,
vcs,
веб-сайтов,
программирование,
разработка
Git и решение проблем с именами файлов в кодировке Unicode
2013-05-18 11:49:42
Когда-то давно, когда я только начинал делать OutWiker, исходники этой программы я выкладывал на ...
+ развернуть текст сохранённая копия
Когда-то давно, когда я только начинал делать OutWiker, исходники этой программы я выкладывал на github. Но оказалось, что у git в то время были большие проблемы с именами файлов, содержащих не латинские буквы (подробнее об этом я в свое время писал в посте Git, Bazaar и русские имена файлов), из-за чего пришлось перейти на Bazaar. [...]
Тэги:
vcs,
программизм
Почему Git не всегда лучше Subversion
2011-06-17 00:33:00
Отличное сравнение SVN и Git с автомобилем и вертолётом: http://www.justincarmony.com/blog/2011/02/ ...
+ развернуть текст сохранённая копия
Отличное сравнение SVN и Git с автомобилем и вертолётом: http://www.justincarmony.com/blog/2011/02/24/analogy-for-moving-from-svn-to-git/
Сори, там по-английски.
Тэги:
git,
linux,
svn,
unix,
vcs
Переименование переменных и слияние изменений в Darcs
2009-10-28 17:23:00
Ныне к традиционным холиварам, вроде
vi
против
emacs
, прибавился ещё
+ развернуть текст сохранённая копия
Ныне к традиционным холиварам, вроде
vi
против
emacs
, прибавился ещё
hg
(Mercurial) против
git
. И то, и другое — распределённые системы управления версиями (уже написано. Впрочем, выбор этими двумя системами не ограничивается, отдельные маньяки успешно пользуются и другими системами. А среди альтернативных систем совершенно особняком стоит
darcs
.
Почитал я тут руководство по
darcs
, и обнаружил что есть у него одна удивительная возможность, которой, насколько мне известно, у его более популярных собратьев нет. А именно, поддержка замен в управляемых файлах. Например, можно переименовать в одной ветке функцию или переменную, в другой ветке делать другие изменения, затрагивающие эти же строки, а потом совершенно волшебным способом автоматически объединить изменения обеих веток. И ручное слияние изменений не потребуется. Возможность настолько необычная, что захотелось поделиться.
Основное отличие
darcs
от собратьев: он отслеживает не состояние каталога с файлами (и историю его изменений), а хранит сами изменения — патчи. А уж состояние рабочего каталога определяется просто как результат применения всех накопленных изменений-патчей. Всякое такое изменение обратимо, а некоторые можно безболезненно переставлять местами (и это очень облегчает слияния).
В случае обычных DVCS, каждое изменение определяется разницей двух состояний каталога. Чтобы объединить такие изменения, нужен их общий «предок», к которому изменения можно применить. В
darcs
изменение не обязательно должно определяться разницей между двумя состояниями каталога. Это позвляет создавать разные типы изменений, и автор может определить что именно изменение делает (семантически). В том числе есть и такой вид изменений:
замена слов в файле (token replace patch).
Покажу, как это работает, а вы уж сами судите, насколько это круто :-)
Завязка
Итак, создадим вначале исходный репозиторий и поместим в него простую программку. Тут отличия между
darcs
и
hg
или
git
минимальны:
$ mkdir repo-0
$ cd repo-0
repo-0$ darcs init
repo-0$ cat > hello.py
def hello(what):
print "Hello %s" % what
hello("World")
^D
repo-0$ darcs add hello.py
repo-0$ darcs record -m 'initial commit' hello.py
Recording changes in "hello.py":
addfile ./hello.py
Shall I record this change? (1/2) [ynWsfvplxdaqjk], or ? for help: y
hunk ./hello.py 1
+def hello(what):
+ print "Hello %s" % what
+
+hello("World")
Shall I record this change? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'initial commit'
А теперь создадим две ветки. В каждой ветке сделаем свои изменения. В одной (A) изменим название переменной
what
на
name
, а в другой (B) переименуем и перепишем функцию
hello()
.
Внезапно!
Клонируем исходный репозиторий:
repo-0$ cd ..
$ darcs get repo-0 repo-A
Copying patches, to get lazy repository hit ctrl-C...
Finished getting.
И переименовываем в этой ветке переменную. Только хитрость, мы хотим не просто сделать замену слов в файле, а мы хотим явно указать
darcs
-у, что это именно замена слов. Поэтому вместо текстового редактора выполняем такую вот команду:
$ cd repo-A
repo-A$ darcs replace what name hello.py
Убеждаемся, что программка изменилась:
repo-A$ cat hello.py
def hello(name):
print "Hello %s" % name
hello("World")
И записываем изменения в репозиторий:
repo-A$ darcs record -m 'renamed: what to name' hello.py
Recording changes in "hello.py":
replace ./hello.py [A-Za-z_0-9] what name
Shall I record this change? (1/1) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'renamed: what to name'
Тем временем...
Параллельно создаём другую ветку и как-нибудь меняем функцию
hello
:
repo-A$ cd ..
$ darcs get repo-0 repo-B
Copying patches, to get lazy repository hit ctrl-C...
Finished getting.
$ cd repo-B
repo-B$ cat > hello.py
def hello(what):
if len(what) > 6:
print "Hello %s" % what
else:
print "Hi %s" % what
hello("World")
^D
Изменения настолько серьёзны, что старое имя функции уже не подходит. Переименовываем её с помощью
darcs replace
:
repo-B$ darcs replace hello greet hello.py
И записываем изменения:
repo-B$ darcs record -m 'changed hello and renamed to greet' hello.py
Recording changes in "hello.py":
hunk ./hello.py 2
- print "Hello %s" % what
+ if len(what) > 6:
+ print "Hello %s" % what
+ else:
+ print "Hi %s" % what
Shall I record this change? (1/2) [ynWsfvplxdaqjk], or ? for help: y
replace ./hello.py [A-Za-z_0-9] hello greet
Shall I record this change? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'changed hello and renamed to greet'
Кровавый финал
А теперь возвращаемся в исходный репозиторий и объединяем изменения:
repo-B$ cd ../repo-0
repo-0$ darcs pull ../repo-A ../repo-B
Wed Oct 28 17:21:41 CET 2009 me@example.com
* changed hello and renamed to greet
Shall I pull this patch? (1/2) [ynWsfvplxdaqjk], or ? for help: y
Wed Oct 28 17:12:12 CET 2009 me@example.com
* renamed: what to name
Shall I pull this patch? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished pulling and applying.
И что же мы видим?
repo-0$ cat hello.py
def greet(name):
if len(name) > 6:
print "Hello %s" % name
else:
print "Hi %s" % name
greet("World")
Изменения
объединились правильно. Система управления версиями оказалась достаточно умной, чтобы применить изменения в нужном порядке (вначале переписать функцию, а уж потом переименовать все случаи использования переменной).
Я впечатлён.
Тэги:
vcs
Переименование переменных и слияние изменений в Darcs
2009-10-28 17:23:00
Ныне к традиционным холиварам, вроде
vi
против
emacs
, прибавился ещё
+ развернуть текст сохранённая копия
Ныне к традиционным холиварам, вроде
vi
против
emacs
, прибавился ещё
hg
(Mercurial) против
git
. И то, и другое — распределённые системы управления версиями (уже написано. Впрочем, выбор этими двумя системами не ограничивается, отдельные маньяки успешно пользуются и другими системами. А среди альтернативных систем совершенно особняком стоит
darcs
.
Почитал я тут руководство по
darcs
, и обнаружил что есть у него одна удивительная возможность, которой, насколько мне известно, у его более популярных собратьев нет. А именно, поддержка замен в управляемых файлах. Например, можно переименовать в одной ветке функцию или переменную, в другой ветке делать другие изменения, затрагивающие эти же строки, а потом совершенно волшебным способом автоматически объединить изменения обеих веток. И ручное слияние изменений не потребуется. Возможность настолько необычная, что захотелось поделиться.
Основное отличие
darcs
от собратьев: он отслеживает не состояние каталога с файлами (и историю его изменений), а хранит сами изменения — патчи. А уж состояние рабочего каталога определяется просто как результат применения всех накопленных изменений-патчей. Всякое такое изменение обратимо, а некоторые можно безболезненно переставлять местами (и это очень облегчает слияния).
В случае обычных DVCS, каждое изменение определяется разницей двух состояний каталога. Чтобы объединить такие изменения, нужен их общий «предок», к которому изменения можно применить. В
darcs
изменение не обязательно должно определяться разницей между двумя состояниями каталога. Это позвляет создавать разные типы изменений, и автор может определить что именно изменение делает (семантически). В том числе есть и такой вид изменений:
замена слов в файле (token replace patch).
Покажу, как это работает, а вы уж сами судите, насколько это круто :-)
Завязка
Итак, создадим вначале исходный репозиторий и поместим в него простую программку. Тут отличия между
darcs
и
hg
или
git
минимальны:
$ mkdir repo-0
$ cd repo-0
repo-0$ darcs init
repo-0$ cat > hello.py
def hello(what):
print "Hello %s" % what
hello("World")
^D
repo-0$ darcs add hello.py
repo-0$ darcs record -m 'initial commit' hello.py
Recording changes in "hello.py":
addfile ./hello.py
Shall I record this change? (1/2) [ynWsfvplxdaqjk], or ? for help: y
hunk ./hello.py 1
+def hello(what):
+ print "Hello %s" % what
+
+hello("World")
Shall I record this change? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'initial commit'
А теперь создадим две ветки. В каждой ветке сделаем свои изменения. В одной (A) изменим название переменной
what
на
name
, а в другой (B) переименуем и перепишем функцию
hello()
.
Внезапно!
Клонируем исходный репозиторий:
repo-0$ cd ..
$ darcs get repo-0 repo-A
Copying patches, to get lazy repository hit ctrl-C...
Finished getting.
И переименовываем в этой ветке переменную. Только хитрость, мы хотим не просто сделать замену слов в файле, а мы хотим явно указать
darcs
-у, что это именно замена слов. Поэтому вместо текстового редактора выполняем такую вот команду:
$ cd repo-A
repo-A$ darcs replace what name hello.py
Убеждаемся, что программка изменилась:
repo-A$ cat hello.py
def hello(name):
print "Hello %s" % name
hello("World")
И записываем изменения в репозиторий:
repo-A$ darcs record -m 'renamed: what to name' hello.py
Recording changes in "hello.py":
replace ./hello.py [A-Za-z_0-9] what name
Shall I record this change? (1/1) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'renamed: what to name'
Тем временем...
Параллельно создаём другую ветку и как-нибудь меняем функцию
hello
:
repo-A$ cd ..
$ darcs get repo-0 repo-B
Copying patches, to get lazy repository hit ctrl-C...
Finished getting.
$ cd repo-B
repo-B$ cat > hello.py
def hello(what):
if len(what) > 6:
print "Hello %s" % what
else:
print "Hi %s" % what
hello("World")
^D
Изменения настолько серьёзны, что старое имя функции уже не подходит. Переименовываем её с помощью
darcs replace
:
repo-B$ darcs replace hello greet hello.py
И записываем изменения:
repo-B$ darcs record -m 'changed hello and renamed to greet' hello.py
Recording changes in "hello.py":
hunk ./hello.py 2
- print "Hello %s" % what
+ if len(what) > 6:
+ print "Hello %s" % what
+ else:
+ print "Hi %s" % what
Shall I record this change? (1/2) [ynWsfvplxdaqjk], or ? for help: y
replace ./hello.py [A-Za-z_0-9] hello greet
Shall I record this change? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished recording patch 'changed hello and renamed to greet'
Кровавый финал
А теперь возвращаемся в исходный репозиторий и объединяем изменения:
repo-B$ cd ../repo-0
repo-0$ darcs pull ../repo-A ../repo-B
Wed Oct 28 17:21:41 CET 2009 me@example.com
* changed hello and renamed to greet
Shall I pull this patch? (1/2) [ynWsfvplxdaqjk], or ? for help: y
Wed Oct 28 17:12:12 CET 2009 me@example.com
* renamed: what to name
Shall I pull this patch? (2/2) [ynWsfvplxdaqjk], or ? for help: y
Finished pulling and applying.
И что же мы видим?
repo-0$ cat hello.py
def greet(name):
if len(name) > 6:
print "Hello %s" % name
else:
print "Hi %s" % name
greet("World")
Изменения
объединились правильно. Система управления версиями оказалась достаточно умной, чтобы применить изменения в нужном порядке (вначале переписать функцию, а уж потом переименовать все случаи использования переменной).
Я впечатлён.
Тэги:
vcs,
программирование