Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 7690 - Разработка git-um   Make a simular bug
Summary: Разработка git-um
Status: CLOSED FIXED
Alias: None
Product: Girar
Classification: Свободные проекты (Open source projects)
Component: Gitum (show other bugs)
Version: 0.7
Hardware: PC All
: P2 normal
Target Milestone: ---
Deadline: 2012-05-21
Assignee: Pavel Shilovsky
QA Contact: Денис Баранов
URL: http://lists.etersoft.ru/pipermail/de...
Whiteboard:
Keywords:
Depends on:
Blocks:
 
In work:
Reported: 2011-09-29 15:28 MSK by Pavel Shilovsky
Modified: 2015-07-28 17:15 MSK (History)
6 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Pavel Shilovsky 2011-09-29 15:28:52 MSK
Git Upstream Manager - дополнительный режим работы Git, позволяющий легко вести ветки разработки со своими патчами и обновлять их с апстрим веток, при этом ведя общую общую историю изменений и поддерживая патчи всегда в актуальном состоянии согласно состоянию апстрим.

В данной баге буду записывать этапы разработки проекта.
Comment 1 Pavel Shilovsky 2011-09-30 19:39:02 MSK
Занимался изучением существующих инструментов работы с Git для Python. Рассмотрел GitPython, pygit2, Dilwich. Все инструменты сейчас находятся в разработке и подходят не полностью. Далее продолжу изучение инструментов и займусь первоначальным дизайном проекта.
Comment 2 Vitaly Lipatov 2011-10-01 18:08:57 MSK
Возможно, стоит рассмотреть вариант постройки поверх существующих утилит, используя в качестве связки только sh. Хотя python, конечно, вариант, но хочется максимально избежать лишних зависимостей. Но для нас целеполагающее, конечно — это скорость разработки.
Comment 3 Vitaly Lipatov 2011-10-01 18:18:42 MSK
Кстати, GitPython мы уже используем в одном проекте — git.eter:/projects/wine/test-robot.git

Там активная работа с патчами, мержи, ветки... Всё работает. Может быть при прочих равных использовать его? Чтобы уж не в каждом проекте своя библиотека...
Comment 4 Pavel Shilovsky 2011-10-04 00:38:06 MSK
Остановился на GitPython. Начал реализацию:

http://git.etersoft.ru/people/piastry/packages/?p=git-um.git;a=summary
Comment 5 Pavel Shilovsky 2011-10-04 16:33:13 MSK
Работал над данной задачей. Добавил возврат к превоначальному состоянию и поменял вывод с трэйса Python на вывод комманд Git.

Что сейчас работает:
1. Основной функционал по обработки веток при применении изменений из апстрим.
2. Возможность возобновление работы после разрешения кофликтов слияния.
3. Возможность полного прерывания операции - возврат на первоначальное состояние.
Comment 6 Pavel Shilovsky 2011-10-11 19:51:02 MSK
Работал над задачей.

Изменения:
1) возможность конфигурирования веток,
2) сохранение состояний ведётся без создания дополнительных веток,
3) коммиты из аптрим применяются в рабочую ветку с актуальными сообщениями,
4) рефакторинг кода.
Comment 7 Pavel Shilovsky 2011-10-17 22:14:13 MSK
Работал над задачей.

Изменения:
1) команда инициализация,
2) автоматическое обновление rebased ветки
3) изменены названия команд и добавлено их описанию, 
4) применён парсер argsparse,
5) добавлена возможность пропустить патч в rebase процессе,
6) удалённую ветку можно теперь задавать в конфигурационном файле,
7) рефакторинг кода.
Comment 8 Pavel Shilovsky 2011-10-24 23:53:04 MSK
Работал над задачей:

1) Исправил ошибку в использовании только удалённой ветки по умолчанию
2) Перешёл на использование GitPython-0.3.0 (с 0.1.6), которая является текущей в Sisyphus.
3) Провёл тестирование на реальном репозитории cifs-2.6.
Comment 9 Pavel Shilovsky 2011-10-31 18:56:31 MSK
Работал над задачей:

1) Ознакомился с системой пакетирования для Python.
2) Создал новую иерархию репозитория.
3) Перенёс переменные бранчей из глобального пространства в класс GitUpstream.
4) Добавил setup.py и правила для gear.
5) Небольшой рефакторинг кода.

Выпустил релиз 0.1-alt1:
http://git.etersoft.ru/people/piastry/packages/?p=git-um.git;a=summary
Comment 10 Pavel Shilovsky 2011-10-31 19:25:43 MSK
Собрал на git.eter ([#1631] DONE git-um.git=0.1-alt1) и сделал анонс в рассылке devel@.
Comment 11 Pavel Shilovsky 2011-10-31 20:38:14 MSK
Выделилась задача на следующий релиз 0.2:
1) Команда create должна сама создавать указанные ветки (либо брать имена по умолчанию).
Comment 12 Pavel Shilovsky 2011-11-01 01:14:28 MSK
(В ответ на comment #11)
> Выделилась задача на следующий релиз 0.2:
> 1) Команда create должна сама создавать указанные ветки (либо брать имена по
> умолчанию).

2) Надо найти замену GitCommandError.stdout.
Comment 13 Александр Морозов 2011-11-01 13:08:02 MSK
> master - наша копия ветки origin/master
> patches - ветка с нашими патчами наверху
> dev - текущая ветка разработки
А чем patches от dev отличается? И где хранится история?


Попробовал потестировать:

$ git clone git://source.winehq.org/git/wine.git wine-um
$ git reset --hard wine-1.3.31
$ git branch patches
$ git branch dev

Прикладываем наш патч в dev-ветке:
$ git checkout dev
$ git am 0001-Add-support-of-native-Windows-drivers-for-USB-tokens.txt

$ git-um create --remote origin/master --upstream master --rebased patches --current dev
.git-un-config missing, using default branch names...

Тут опечатка: .git-uN-config ?

Сохраняем наш патч в patches:
$ git-um update HEAD^ HEAD

Теперь пробуем обновиться от 1.3.31 до текущего апстрима:
$ git-um pull
..........
Довольно долго работает, надо сказать...

Через какое-то время упало:
merge commit 8e62e823d6a41f40d1b50c5a77083290f525bb0c
patching file dlls/mmdevapi/tests/capture.c
patching file dlls/mmdevapi/tests/render.c
merge commit 507d92905174ccef96a33a806bfc383874ff7dcf
Traceback (most recent call last):
  File "/usr/bin/git-um", line 72, in <module>
    main()
  File "/usr/bin/git-um", line 51, in main
    GitUpstream().pull()
  File "/usr/lib/python2.6/site-packages/gitupstream/gitupstream.py", line 53, in pull
    self._process_commits()
  File "/usr/lib/python2.6/site-packages/gitupstream/gitupstream.py", line 163, in _process_commits
    print(e.stdout)
AttributeError: 'GitCommandError' object has no attribute 'stdout'

$ git branch
* (no branch)
  dev
  master
  patches

git-um pull берёт обновления из origin/master или из master?
Если из origin/master, то, ИМХО, это не всегда удобно. Хочется, чтобы была возможность обновиться до какого-то релиза апстрима, а не до самого последнего коммита.
Comment 14 Pavel Shilovsky 2011-11-01 13:40:41 MSK
(В ответ на comment #13)
> > master - наша копия ветки origin/master
> > patches - ветка с нашими патчами наверху
> > dev - текущая ветка разработки
> А чем patches от dev отличается? И где хранится история?

История хранится последовательно в dev, в ветке patches наши патчи всегда лежат сверху апстрим.

> 
> 
> Попробовал потестировать:

Спасибо!

> 
> $ git clone git://source.winehq.org/git/wine.git wine-um
> $ git reset --hard wine-1.3.31
> $ git branch patches
> $ git branch dev
> 
> Прикладываем наш патч в dev-ветке:
> $ git checkout dev
> $ git am 0001-Add-support-of-native-Windows-drivers-for-USB-tokens.txt
> 
> $ git-um create --remote origin/master --upstream master --rebased patches
> --current dev
> .git-un-config missing, using default branch names...
> 
> Тут опечатка: .git-uN-config ?

Да, конечно.

> 
> Сохраняем наш патч в patches:
> $ git-um update HEAD^ HEAD
> 
> Теперь пробуем обновиться от 1.3.31 до текущего апстрима:
> $ git-um pull
> ..........
> Довольно долго работает, надо сказать...

Потому что оно каждый раз делает rebase с очередным коммитом из апстрим - чтобы держать актуальной ветку patches и не потерять историю в ветке dev.

> 
> Через какое-то время упало:
> merge commit 8e62e823d6a41f40d1b50c5a77083290f525bb0c
> patching file dlls/mmdevapi/tests/capture.c
> patching file dlls/mmdevapi/tests/render.c
> merge commit 507d92905174ccef96a33a806bfc383874ff7dcf
> Traceback (most recent call last):
>   File "/usr/bin/git-um", line 72, in <module>
>     main()
>   File "/usr/bin/git-um", line 51, in main
>     GitUpstream().pull()
>   File "/usr/lib/python2.6/site-packages/gitupstream/gitupstream.py", line 53,
> in pull
>     self._process_commits()
>   File "/usr/lib/python2.6/site-packages/gitupstream/gitupstream.py", line 163,
> in _process_commits
>     print(e.stdout)
> AttributeError: 'GitCommandError' object has no attribute 'stdout'

Сам только сегодня обнаружил эту багу, появившуюся от переезда с GitPython 0.1.6 на 0.3.0.

Тут видимо конфликт мержинга произошёл: можно посмотреть  grep "<<<" * -R.

После того, как исправлю багу, будет выводится сообщение из-за чего произошла проблема.

Пока же можно не обращать на это внимание.

> 
> $ git branch
> * (no branch)
>   dev
>   master
>   patches
> 
> git-um pull берёт обновления из origin/master или из master?
> Если из origin/master, то, ИМХО, это не всегда удобно. Хочется, чтобы была
> возможность обновиться до какого-то релиза апстрима, а не до самого последнего
> коммита.

Обновления берутся из ветки --remote (в нашем случае origin/master), которая была указана в git-um create команде и складываются в ветку --upstream (тоже указанную git-um create - нашем случае master) .

Можно добавить аргумент к команде git-um pull чтобы можно было указать с какой удалённой веткой мержиться в этот раз. И использовать значение из конфига, если этот аргумент не указан.

Так же стоит добавить строчку в .gitignore:
.git-um-*
Comment 15 Pavel Shilovsky 2011-11-01 13:48:19 MSK
(В ответ на comment #14)
> 
> Пока же можно не обращать на это внимание.

Нужно найти проблемный файл, исправить, сделать git add файл и продолжить процесс дальше:
git-um pull --continue
Comment 16 Александр Морозов 2011-11-01 14:26:38 MSK
Сделал git add, что-то оно не хочет продолжать:
[amorozov@atlant wine-um]$ git diff | cat
[amorozov@atlant wine-um]$ git-um pull --continue
.git-un-config missing, using default branch names...
Traceback (most recent call last):
  File "/usr/bin/git-um", line 72, in <module>
    main()
  File "/usr/bin/git-um", line 45, in main
    GitUpstream().continue_pull('--continue')
  File "/usr/lib/python2.6/site-packages/gitupstream/gitupstream.py", line 64, in continue_pull
    self._load_state()
  File "/usr/lib/python2.6/site-packages/gitupstream/gitupstream.py", line 233, in _load_state
    self._saved_branches[self._upstream] = f.readline().split()[0]
AttributeError: 'GitUpstream' object has no attribute '_upstream'

> История хранится последовательно в dev, в ветке patches наши патчи всегда лежат
> сверху апстрим.
Правильно ли я понимаю, что коммит в dev - это дифф между двумя состояниями ветки patches (до ребэйза поверх нового коммита и после), сохранённый под именем этого коммита?

Посмотрел git log dev. Как-то меня смущает то, что я там получаюсь автором всех патчей из апстрима. ИМХО, выкидывать оригинального автора неправильно.

> Можно добавить аргумент к команде git-um pull чтобы можно было указать с какой
> удалённой веткой мержиться в этот раз. И использовать значение из конфига, если
> этот аргумент не указан.
Может быть, лучше мержиться с master? А для обновления master до нужного коммита сделать какую-то отдельную команду? А то иначе непонятно, зачем вообще этот master нужен, если то, что в нём хранится, не влияет на мерж?
Comment 17 Pavel Shilovsky 2011-11-01 16:52:03 MSK
(В ответ на comment #16)
> Сделал git add, что-то оно не хочет продолжать:
> [amorozov@atlant wine-um]$ git diff | cat
> [amorozov@atlant wine-um]$ git-um pull --continue
> .git-un-config missing, using default branch names...

главная проблема тут. Видимо, .git-um-config  включился в ветку dev и после смены бранчей естественно пропал. Проблема в том, что после наложения патча приходится делать git add -A, который подцепляет его, если не указать правило в .gitignore.

Я думаю, стоит сделать так, чтобы create сам добавлял нужное правило. Но возникает такая проблема:

1 случай) : .gitignore не был добавлен в репозиторий ранее. Тогда мы посто создаём его и добавляем нужны правила.

2 случай): .gitignore был добавлен в репозиторий. Тогда нам нужно не только добавить нужное правило, но ещё и закоммитить изменения - сделать дополнительный коммит в ветке dev. Потом его нужно перенести в patches, чтобы поддерживать инвариант (git diff patches dev == 0).

Чтобы не рассматривать отдельна два случая можно всегда следовать второму. При этом, когда мы будем генерировать патчи из ветки patches нам просто не надо учитывать первый коммит после master.

> Traceback (most recent call last):
>   File "/usr/bin/git-um", line 72, in <module>
>     main()
>   File "/usr/bin/git-um", line 45, in main
>     GitUpstream().continue_pull('--continue')
>   File "/usr/lib/python2.6/site-packages/gitupstream/gitupstream.py", line 64,
> in continue_pull
>     self._load_state()
>   File "/usr/lib/python2.6/site-packages/gitupstream/gitupstream.py", line 233,
> in _load_state
>     self._saved_branches[self._upstream] = f.readline().split()[0]
> AttributeError: 'GitUpstream' object has no attribute '_upstream'

Ага, бага если не находит конфиг файл - исправлю.

> 
> > История хранится последовательно в dev, в ветке patches наши патчи всегда лежат
> > сверху апстрим.
> Правильно ли я понимаю, что коммит в dev - это дифф между двумя состояниями
> ветки patches (до ребэйза поверх нового коммита и после), сохранённый под
> именем этого коммита?

Да.

> 
> Посмотрел git log dev. Как-то меня смущает то, что я там получаюсь автором всех
> патчей из апстрима. ИМХО, выкидывать оригинального автора неправильно.

Исправлю.

> 
> > Можно добавить аргумент к команде git-um pull чтобы можно было указать с какой
> > удалённой веткой мержиться в этот раз. И использовать значение из конфига, если
> > этот аргумент не указан.
> Может быть, лучше мержиться с master? А для обновления master до нужного
> коммита сделать какую-то отдельную команду? А то иначе непонятно, зачем вообще
> этот master нужен, если то, что в нём хранится, не влияет на мерж?

master нужен вот зачем: чтобы понять какие коммиты из апстрима мы уже обработали и какие нет. То есть, каждый раз мы получаем список новых коммитов и накладываем их последовательно в master, patches и dev.
Comment 18 Pavel Shilovsky 2011-11-01 16:58:51 MSK
Задачи на следующий релиз 0.2:

1) Команда create должна сама создавать указанные ветки (либо брать имена по
умолчанию). Так же она должна править .gitignore файл для ветки разработки.

2) Надо найти замену GitCommandError.stdout. Сделать вывод pull удобным для восприятия и информативным.

3) Коммиты из апстрим под оригинальным авторством.

4) Аргумент к pull, чтобы вручную указывать, из какой ветки тянуть изменения.

5) Инициализация веток по умолчанию в случае неполноты или отсутствия .git-um-config.
Comment 19 Pavel Shilovsky 2011-11-01 21:45:12 MSK
Нашёл альтернативу для GitCommandError.stdout. Теперь пробрасываю гит команде rebase временный файл для вывода stdout, и при случае ошибки слияния, вывожу вывод гит команды из файла на экран.
Comment 20 Pavel Shilovsky 2011-11-29 17:31:54 MSK
(В ответ на comment #18)
> Задачи на следующий релиз 0.2:
> 
> 1) Команда create должна сама создавать указанные ветки (либо брать имена по
> умолчанию). Так же она должна править .gitignore файл для ветки разработки.

Сделано.

> 
> 2) Надо найти замену GitCommandError.stdout. Сделать вывод pull удобным для
> восприятия и информативным.

Сделано тут http://bugs.etersoft.ru/show_bug.cgi?id=7690#c19.

> 
> 3) Коммиты из апстрим под оригинальным авторством.

Сделано.

> 
> 4) Аргумент к pull, чтобы вручную указывать, из какой ветки тянуть изменения.

Сделано. Теперь pull принимает аргумент --branch NAME (в случае начала слияния).

> 
> 5) Инициализация веток по умолчанию в случае неполноты или отсутствия
> .git-um-config.

Сделано.

Далее планирую заняться более тщательным тестированием и подготовкой к выпуску 0.2.
Comment 21 Pavel Shilovsky 2011-11-30 20:33:35 MSK
Работал над задачей.

1. Перенёс конфигурационные файлы в .git/.
2. Переименовал в gitum (без дефиса).
3. Добавил команду remove.
4. Поправил вывод сообщений.
5. Исправил некоторые баги и неточности.

Протестировал и собрал версию 0.2-alt1 ([#1880] DONE git-um.git=0.2-alt1).
Comment 22 Pavel Shilovsky 2011-11-30 22:49:13 MSK
Поправил небольшую неточность, собрал 0.2-alt2 ([#1885] DONE git-um.git=0.2-alt2).

Сделал следующие изменения (войдут в следующий релиз - 0.3-alt1):
1. Лог не выбрасывается библиотекой по умолчанию. gitum утилита выставляет параметр with_log=True.
2. Добавлен тест на основной функционал.
3. Исправлена работа библиотеки в режиме пере переиспользования GitUpstream объекта.
Comment 23 Александр Морозов 2011-12-01 14:20:22 MSK
Посмотрел. В первом приближении вроде всё ОК.
Есть несколько предложений:

1. При работе git pull в строках
merge commit 97b7bb2bab60342a90ab3392f7b42b0f72bdec20
хорошо бы выводить ещё какой нибудь счётчик, что это n-й коммит из m. А то оно долго работает, хорошо бы представлять, сколько ещё ждать.

2. Можно ли сделать, чтобы gitum update работал без аргументов? Например, искал коммит с эквивалентным head-у другой ветки содержимым и обновлял от него.

3. Можно ли сделать, чтобы gitum update мог обновлять не только rebased-ветку на основе current-ветки, но и наоборот: current-ветку на основе rebased-ветки? Вроде бы в любом случае это просто прикладывание патчей из одной ветки к другой.
Comment 24 Александр Морозов 2011-12-01 15:07:50 MSK
Подумал тут ещё. В чём цель наличия наших патчей сверху? В том, что мы можем какой-то патч легко убрать или изменить. Но при работе с текущим gitum не очень понятно, как это делать.

Убрать легко, если у нас один независимый (от других наших патчей) патч. Тогда можно просто откатить его в rebased-ветке и приложить получившийся коммит к current-ветке. Если же у нас, например, два патча, и нам надо убрать первый, то нам надо откатить два патча, а затем приложить второй, отредактировав его. И приложить два отката и отредактированный патч из rebased-ветки к current-ветке. Случай с изменением патча похоже выглядит. Вроде бы всё ОК, но мне не очень нравится, что в rebased-ветке будут множественные откаты и прикладывания одного и того же патча. Всё-таки цель - получить минимальный и понятный набор патчей.

Кроме того, текущий gitum не позволяет нам получить этот понятный набор патчей сверху для какой-то старой версии.
Comment 25 Pavel Shilovsky 2011-12-01 15:36:35 MSK
(В ответ на comment #23)
> Посмотрел. В первом приближении вроде всё ОК.
> Есть несколько предложений:
> 
> 1. При работе git pull в строках
> merge commit 97b7bb2bab60342a90ab3392f7b42b0f72bdec20
> хорошо бы выводить ещё какой нибудь счётчик, что это n-й коммит из m. А то оно
> долго работает, хорошо бы представлять, сколько ещё ждать.
Да.

> 
> 2. Можно ли сделать, чтобы gitum update работал без аргументов? Например, искал
> коммит с эквивалентным head-у другой ветки содержимым и обновлял от него.
Тут можно просто сохранять топ ветки dev в state-файле после pull и при update мержить в rebased разницу между ними.

> 
> 3. Можно ли сделать, чтобы gitum update мог обновлять не только rebased-ветку
> на основе current-ветки, но и наоборот: current-ветку на основе rebased-ветки?
> Вроде бы в любом случае это просто прикладывание патчей из одной ветки к
> другой.
Если мы меняем ветку, rebase, то мы не добавляем туда новых патчей. Мы только можем изменить там существующий набор патчей (отредактировать или удалить какой-то патч). После этого у нас получается новая ветка rebase. Далее мы делаем diff со старой и накладываем в dev и коммитим. Этот функционал нужно добавлять отдельной командой - например, editpatches.
Comment 26 Pavel Shilovsky 2011-12-01 15:46:11 MSK
(В ответ на comment #24)
> Подумал тут ещё. В чём цель наличия наших патчей сверху? В том, что мы можем
> какой-то патч легко убрать или изменить. Но при работе с текущим gitum не очень
> понятно, как это делать.
Описал выше. Такой функционал просто ещё не добавлен.

> 
> Убрать легко, если у нас один независимый (от других наших патчей) патч. Тогда
> можно просто откатить его в rebased-ветке и приложить получившийся коммит к
> current-ветке. Если же у нас, например, два патча, и нам надо убрать первый, то
> нам надо откатить два патча, а затем приложить второй, отредактировав его. И
> приложить два отката и отредактированный патч из rebased-ветки к current-ветке.
> Случай с изменением патча похоже выглядит. Вроде бы всё ОК, но мне не очень
> нравится, что в rebased-ветке будут множественные откаты и прикладывания одного
> и того же патча. Всё-таки цель - получить минимальный и понятный набор патчей.
> 
> Кроме того, текущий gitum не позволяет нам получить этот понятный набор патчей
> сверху для какой-то старой версии.
Используя подход, описанные выше, у нас получается минимальный набор патчей.

Получается что делает команда editpatches:
1) перед выполнением git diff rebased dev == 0
2) запускается интерактивный rebase на ветке rebased.
3) после того, как мы отредактировали наши патчи, и rebase завершился успешно, получается diff между новым rebased и dev.
4) этот diff накладывается на dev и делается коммит с введённым нами сообщением. 
5) в результате на выходе:
git diff rebased dev == 0
rebased с обновлёнными патчами наверху
dev - с одним коммитом, исправляющим (удаляющим) существующий патч.

Чтобы история в ветке dev была как можно более актуальной, то в момент интерактивного rebase нужно менять (удалять) только один патч. Соответственно, чтобы изменить (удалить) несколько патчей, нужно сделать несколько раз gitum editpatches (может быть даже стоит её назвать editpatch).
Comment 27 Pavel Shilovsky 2011-12-08 13:24:37 MSK
Работал над задачей:

1) Реализовал счётчик [cur/all] для текущего обрабатываемого коммита из апстрим ветки.
2) Реализовал команду editpatch:
а) editpatch - открывает интерактивный rebase
б) editpatch --continue/--abort/--skip - передаёт данные команды rebase
a) editpatch --commit делает коммит на основе diff между предыдущей версии ветки с патчами и новой версии.
Comment 28 Pavel Shilovsky 2011-12-14 14:38:03 MSK
Работал над задачей.

1) Изменил интерфейс команды update - теперь можно пользоваться двумя способами:
 а) gitum update -n N,
 б) gitum update HEAD~N:HEAD,
где N - количество коммитов, которые нужно перенести из ветки разработки в ветку с патчами.
2) Добавил код для проверки актуальности состояния перед pull, update, editpatch.
3) Поправил код.
4) Провёл тестирование.
5) Собрал версию 0.3-alt1: [#1893] DONE gitum.git=0.3-alt1 и слелал сообщение в рассылку.
Comment 29 Pavel Shilovsky 2011-12-14 19:16:24 MSK
> 5) Собрал версию 0.3-alt1: [#1893] DONE gitum.git=0.3-alt1 и слелал сообщение в
> рассылку.

Тестировал на Wine репозитории - успешно.

Так же заметил, что подход, используемый в нашей реализации, не работает для апстрим-репозиториев, которые имеют не непрерывную историю (то есть содержат коммиты вида "Merge .. into .."). Примером таких репозиториев может служить репозиторий ядра Linux. Обратными примерами (непрерывная история) являются: Wine, Samba.

Для работы с репозиториями первого вида, можно мержить только коммиты начинающиеся с "Merge ..." + все остальные коммиты сверху. История конечно потеряется, но скорость значительно увеличится. Здесь вопрос остаётся открытым.
Comment 30 Александр Морозов 2011-12-15 15:18:33 MSK
>  б) gitum update HEAD~N:HEAD,
Не работает:
$ gitum update HEAD~1:HEAD
usage: gitum [-h] {pull,update,create,remove,editpatch} ...
gitum: error: unrecognized arguments: HEAD~1:HEAD

После editpatch переходим в rebased-ветку:
$ git branch
* dev
  master
  patches
$ gitum editpatch
Successfully rebased and updated refs/heads/patches.
$ git branch
  dev
  master
* patches
Было бы лучше вернуться обратно в ту ветку, в которой мы были.

Если вписать edit для одного из коммитов, то выведет такое:
Stopped at 7403672... Add support of native Windows drivers for USB tokens.
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

Было бы неплохо, чтобы писало gitum editpatch вместо git rebase, если это возможно сделать.

Ещё такой вопрос. Если кто-то допустит ошибку при редактировании rebased-ветки, то как потом откатить его изменения? Особенно если это заметили не сразу.
Comment 31 Pavel Shilovsky 2011-12-15 15:44:34 MSK
Спасибо за тестирование!

(В ответ на comment #30)
> >  б) gitum update HEAD~N:HEAD,
> Не работает:
> $ gitum update HEAD~1:HEAD
> usage: gitum [-h] {pull,update,create,remove,editpatch} ...
> gitum: error: unrecognized arguments: HEAD~1:HEAD

Надо так:
gitum update --range HEAD~1:HEAD

(Всегда можно посмотреть справку к команде с помощью gitum COMMAND -h)

> 
> После editpatch переходим в rebased-ветку:
> $ git branch
> * dev
>   master
>   patches
> $ gitum editpatch
> Successfully rebased and updated refs/heads/patches.
> $ git branch
>   dev
>   master
> * patches
> Было бы лучше вернуться обратно в ту ветку, в которой мы были.

Чтобы закончить процесс editpatch, нужно дать комманду

gitum editpatch --commit // сделает коммит в dev, согласно изменениям из editpatch.

и вернёмся в ветку dev. 

> 
> Если вписать edit для одного из коммитов, то выведет такое:
> Stopped at 7403672... Add support of native Windows drivers for USB tokens.
> You can amend the commit now, with
> 
>         git commit --amend
> 
> Once you are satisfied with your changes, run
> 
>         git rebase --continue
> 
> Было бы неплохо, чтобы писало gitum editpatch вместо git rebase, если это
> возможно сделать.

Да, точно - надо поправить.

> 
> Ещё такой вопрос. Если кто-то допустит ошибку при редактировании rebased-ветки,
> то как потом откатить его изменения? Особенно если это заметили не сразу.

Пока не сделан gitum editpatch --commit, всегда можно сделать gitum editpatch --abort, который вернёт всё как было.
Comment 32 Александр Морозов 2011-12-15 16:01:04 MSK
> > Ещё такой вопрос. Если кто-то допустит ошибку при редактировании rebased-ветки,
> > то как потом откатить его изменения? Особенно если это заметили не сразу.
> 
> Пока не сделан gitum editpatch --commit, всегда можно сделать gitum editpatch
> --abort, который вернёт всё как было.

А если уже сделан? Например, кто-то объединил пару десятков патчей в один. Потом решили, что это плохо. Как всё вернуть назад без кучи ручной работы?
В общем, было бы неплохо как-то сохранять предыдущие состояния rebased-ветки.
Comment 33 Pavel Shilovsky 2011-12-19 17:20:17 MSK
(В ответ на comment #32)
> 
> А если уже сделан? Например, кто-то объединил пару десятков патчей в один.
> Потом решили, что это плохо. Как всё вернуть назад без кучи ручной работы?
> В общем, было бы неплохо как-то сохранять предыдущие состояния rebased-ветки.

В случае, если --commit уже сделан, то на данный момент никак.

Если требуется возвращать назад состояние ветки rebase, то нужно возвращать назад и состояние веткок master и current. Так же если есть вероятность, что в последнем действии могут напортачить, то и есть вероятность напортачить в двух последних действиях и т.д. Возможно, стоит хранить всю историю изменений?

Возникает вопрос как хранить.

1. Завести ветку states (форк любого места master), куда добавить файл __state__, где написать:

master_id rebased_id current_id

и в нужный момент обновлять данный файл и делать коммит в ветку states. Если потребуется вернуть какое состояние - просто вытаскиваем нужное состояние из ветки и делаем reset --hard каждой ветки на соответствующий коммит айди.

Достоинства:
- файл не разрастается;
- можно легко переносить с места на место - коммитить в удалённый бранч.

Недостатки:
- присутствие посторонней ветки в репозитории;
- проект потенциально может содержать файл с таким же названием.

2. Завести файл в .git/ где хранить данные о ветке (как и в предыдущем пункте + дату/описание). В нужный момент добавлять в данный файл состояние.

Достоинства:
- нет посторонней ветки;
- ислючается возможность совпадения имён.

Недостатки:
- файл с историей разрастается;
- сложность в перенесении с места на место.
Comment 34 Александр Морозов 2011-12-19 18:13:45 MSK
> 1. Завести ветку states (форк любого места master), куда добавить файл
> __state__, где написать:
....................
> - проект потенциально может содержать файл с таким же названием.

Можно завести спец. ветку только с этим файлом.

Тут ещё такой вопрос. Не получится ли так, что в результате какого-нибудь git gc старые коммиты rebased_id, упоминающиеся в файле __state__ будут вычищены, ведь на них никто не ссылается?

> 2. Завести файл в .git/ где хранить данные о ветке (как и в предыдущем пункте +
> дату/описание). В нужный момент добавлять в данный файл состояние.
....................
> - сложность в перенесении с места на место.

Я так понимаю, нельзя будет сделать git push. Если так, то это не подходит.
Comment 35 Александр Морозов 2011-12-19 18:19:15 MSK
Я, когда обсуждал с Виталиком подобную систему, предлагал делать ветку, в которой бы хранился файл с номером коммита апстрима и набор патчей поверх в виде текстовых файлов. В такой системе rebased- и current-ветки можно было автоматически генерировать из этой ветки с патчами.
Comment 36 Pavel Shilovsky 2011-12-20 13:28:50 MSK
(В ответ на comment #34)
> > 1. Завести ветку states (форк любого места master), куда добавить файл
> > __state__, где написать:
> ....................
> > - проект потенциально может содержать файл с таким же названием.
> 
> Можно завести спец. ветку только с этим файлом.

Да, точно.

> 
> Тут ещё такой вопрос. Не получится ли так, что в результате какого-нибудь git
> gc старые коммиты rebased_id, упоминающиеся в файле __state__ будут вычищены,
> ведь на них никто не ссылается?

Получится.

> 
> > 2. Завести файл в .git/ где хранить данные о ветке (как и в предыдущем пункте +
> > дату/описание). В нужный момент добавлять в данный файл состояние.
> ....................
> > - сложность в перенесении с места на место.
> 
> Я так понимаю, нельзя будет сделать git push. Если так, то это не подходит.

Ок.
Comment 37 Pavel Shilovsky 2011-12-20 15:12:46 MSK
(В ответ на comment #35)
> Я, когда обсуждал с Виталиком подобную систему, предлагал делать ветку, в
> которой бы хранился файл с номером коммита апстрима и набор патчей поверх в
> виде текстовых файлов. В такой системе rebased- и current-ветки можно было
> автоматически генерировать из этой ветки с патчами.

Чтобы легко генерировать ветку с патчами, нужно ещё сохранять коммит из current (вывод git format-path -1) после каждого обновления этого бранча. То есть на данный момент я вижу такой алгоритм действий:

1) Произошёл gitum update, gitum editpatch --commit или gitum pull (diff rebased current == "")

2) rm -rf *.patch; git format-patch UPSTREAM.HEAD.id..REBASED.HEAD.id

3) mv *.patch /tmp/tempgitumdir

4) git format-patch CURRENT.HEAD.id^..CURRENT.HEAD.id

5) mv *.patch /tmp/tempgitumdir/current_patch_

6) git checkout patches_branch (ветка с патчами)

7) git rm *.patch; mv /tmp/tempgitumgir/*.patch ./

8) git add *.patch

9) mv /tmp/tempgitumdir/current_patch_ ./

10) git add current_patch_

11) UPSTREAM.HEAD.id -> state

12) git commit -m CURRENT.HEAD.message

После этого у нас ветка patches_branch содержит последние актуальные патчи, коммит из апстрим, на который они накладываются и изменение для current ветки (для её восстановления).
Comment 38 Vitaly Lipatov 2011-12-20 20:58:30 MSK
К сожалению, при создании баги утерялась первоначальная формулировка задачи (см. также URL):

В репозитории создаётся несколько веток
1. upstream (неизменённая)
2. rebase (где наши патчи всегда сверху)
3. history - она же непрерывная (куда отражается в виде коммита каждое 
изменение ветки 2)
4. patches - ветка с нашими патчами

Схема такая
1. в ветке 1 появляется новый коммит
2. делаем rebase ветки 2, чтобы добавить новый коммит, оставив наши патчи 
сверху
3. делаем diff между новым состоянием ветки 2 и предыдущим, получаем коммит, 
который добавляем в ветку 3

Ветка 4, по сути, просто хранит результат git format-patch для наших коммитов 
в ветке 2

Суть в том, что ветка 3 получается непрерывной, там сохраняется история, 
последовательно добавляются коммиты. Её можно использовать для сборки пакетов 
и для публикации

Получившийся коммит в ветке 3 будет не копией коммита из апстрима и лишь его 
подобием. При этом возможно использовать описание оригинального коммита, ведь 
подобный коммит будет вносить те же изменения.
Comment 39 Pavel Shilovsky 2011-12-21 00:00:27 MSK
> 1) Произошёл gitum update, gitum editpatch --commit или gitum pull (diff
> rebased current == "")
> 
> 2) rm -rf *.patch; git format-patch UPSTREAM.HEAD.id..REBASED.HEAD.id
> 
> 3) mv *.patch /tmp/tempgitumdir
> 
> 4) git format-patch CURRENT.HEAD.id^..CURRENT.HEAD.id
> 
> 5) mv *.patch /tmp/tempgitumdir/current_patch_
> 
> 6) git checkout patches_branch (ветка с патчами)
> 
> 7) git rm *.patch; mv /tmp/tempgitumgir/*.patch ./
> 
> 8) git add *.patch
> 
> 9) mv /tmp/tempgitumdir/current_patch_ ./
> 
> 10) git add current_patch_
> 
> 11) UPSTREAM.HEAD.id -> state
> 
> 12) git commit -m CURRENT.HEAD.message
> 

Реализовал данный функционал. Далее нужно добавить генерацию веток upstream, rebased и current по данной ветке для обеспечения переносимости репозитория путём перенесения лишь данной ветки.
Comment 40 Pavel Shilovsky 2011-12-21 14:51:52 MSK
> Реализовал данный функционал. Далее нужно добавить генерацию веток upstream,
> rebased и current по данной ветке для обеспечения переносимости репозитория
> путём перенесения лишь данной ветки.

Добавил генерацию веток по ветке с патчами. Теперь для восстановления любого состояния репозитория достаточно вынуть нужный коммит из данной ветки и сделать gitum restore - ветки создадутся заново в нужном состоянии (с копиями коммитов, которые были на тот момент).
Comment 41 Pavel Shilovsky 2011-12-22 12:28:12 MSK
Добавил исключения в вызовы модуля gitupstream, что позволит корректно использовать как библиотеку. Поправил код, исправил некоторые неточности. Написал письмо в рассылку со своим видением требуемого функционала.
Comment 42 Pavel Shilovsky 2012-01-31 23:34:42 MSK
Работал над задачей:
1) Переместил конфигурационный файл в отедельную ветку gitum-config.
2) Переименовал команду pull в merge (что больше соответсвует действительности).
3) Добавил возможность работы с удалённым gitum репозиторием:
    а) clone
    б) pull - локальные коммиты остаются наверху (копии).
    в) push в удалённый gitum репозиторий.
4) Исправлен баг несохранения ветки с патчами при merge.
Comment 44 Pavel Shilovsky 2012-02-02 00:37:32 MSK
1) Добавил возможность работы не только из корневой папки git репозитория.
2) Переписал существующий тест, добавил новый на проверку удалённой работы.
3) Переписал логику команды restore - теперь имена веток берутся из конфигурационного файла + команда принимает идентификатор коммита для восстановления.
4) Поработал над стилем кода, поправил некоторые ошибки.
Comment 45 Pavel Shilovsky 2012-02-03 18:54:15 MSK
Поправил команду push (ветка rebased заливается только через --force, поскольку постоянно обновляется через rebase), добавил возможность указать git-remote для команды pull, поправил код restore.

Провёл тесты и выпустил gitum-0.4.1-alt1:

[#2085] DONE gitum.git=0.4.1-alt1.
Comment 46 Александр Морозов 2012-02-13 15:17:59 MSK
Конфигурационный файл, похоже, неправильно заполняется:
$ gitum create --remote origin/master --upstream master --rebased rebased --patches patches --current dev
$ git show gitum-config:.gitum-config | cat
remote = origin/master
current = dev
upstream = master
rebased = patches
patches = patches
Comment 47 Pavel Shilovsky 2012-02-14 12:32:44 MSK
Сделал страничку на Wiki: http://wiki.etersoft.ru/GitUM?v=142w.

По поводу create:

[piastry@euclid gitum]$ gitum create --remote origin/master --upstream master --rebased rebased
[piastry@euclid gitum]$ git show gitum-config:.gitum-config | cat
remote = origin/master
current = current
upstream = master
rebased = rebased
patches = patches
[piastry@euclid gitum]$ gitum remove --full
[piastry@euclid gitum]$ gitum create --remote origin/master --upstream master --rebased TEST
[piastry@euclid gitum]$ git show gitum-config:.gitum-config | cat
remote = origin/master
current = current
upstream = master
rebased = TEST
patches = patches
[piastry@euclid gitum]$ gitum remove --full

У меня всё верно. Могу посмотреть на месте, что там такое.
Comment 48 Pavel Shilovsky 2012-02-14 13:49:42 MSK
Добавил к create возможность работать без параметров. В этом случае конфиг файл (и конфиг ветка) не создаются. Далее надо разобраться с веткой rebased - её можно заливать на сервер только через параметр --force, поскольку она всё время обновляется через rebase, что неправильно. Как один из вариантов: генерировать ветку rebased только локально (из ветки patches), а на сервере хранить только upstream, current и  patches, которые непрерывны.
Comment 49 Александр Морозов 2012-02-14 15:41:13 MSK
Вот так работает нормально:
$ gitum create --remote origin/master --upstream master --rebased TEST
$ git branch
  TEST
* current
  gitum-config
  master
  patches
$ git show gitum-config:.gitum-config | cat
remote = origin/master
current = current
upstream = master
rebased = TEST
patches = patches

А если добавить --patches, то получаем вот что:
$ gitum create --remote origin/master --upstream master --rebased TEST --patches patches
$ git branch
* current
  gitum-config
  master
  patches
$ git show gitum-config:.gitum-config | cat
remote = origin/master
current = current
upstream = master
rebased = patches
patches = patches

Воспроизводится на atlant.
Comment 50 Александр Морозов 2012-02-14 16:30:15 MSK
Зачем в ветке gitum-config хранится всё дерево исходников в состоянии на момент выполнения gitum create?
Может быть, лучше, чтобы там был только файл конфигурации?
Comment 51 Pavel Shilovsky 2012-02-15 10:18:50 MSK
(В ответ на comment #49)
> Вот так работает нормально:
> $ gitum create --remote origin/master --upstream master --rebased TEST
> $ git branch
>   TEST
> * current
>   gitum-config
>   master
>   patches
> $ git show gitum-config:.gitum-config | cat
> remote = origin/master
> current = current
> upstream = master
> rebased = TEST
> patches = patches
> 
> А если добавить --patches, то получаем вот что:
> $ gitum create --remote origin/master --upstream master --rebased TEST
> --patches patches
> $ git branch
> * current
>   gitum-config
>   master
>   patches
> $ git show gitum-config:.gitum-config | cat
> remote = origin/master
> current = current
> upstream = master
> rebased = patches
> patches = patches
> 
> Воспроизводится на atlant.

Спасибо. Поправил ошибку в версии 0.4.2-alt1.
Comment 52 Pavel Shilovsky 2012-02-15 10:56:57 MSK
(В ответ на comment #50)
> Зачем в ветке gitum-config хранится всё дерево исходников в состоянии на момент
> выполнения gitum create?
> Может быть, лучше, чтобы там был только файл конфигурации?

Это было сделано так, потому что иначе, если создавать пустую ветку, команда create будет работать долго на большом репозитории. Сейчас проверил на репозитории ядра (от коммита 3.0) - время создания пустой ветки и последующий checkout обратно больше 5 минут. К тому же ветку gitum-config не предполагается читать напрямую - она только для gitum команд.
Comment 53 Александр Морозов 2012-02-15 13:56:16 MSK
> Это было сделано так, потому что иначе, если создавать пустую ветку, команда
> create будет работать долго на большом репозитории. Сейчас проверил на
> репозитории ядра (от коммита 3.0) - время создания пустой ветки и последующий
> checkout обратно больше 5 минут. К тому же ветку gitum-config не предполагается
> читать напрямую - она только для gitum команд.

Можно создавать ветку без переключения. Как-то так:
blob=`cat <<EOF | git hash-object -w --stdin
remote = origin/master
current = current
upstream = master
rebased = rebased
patches = patches
EOF`
tree=`echo 100644 blob ${blob}$'\t'.gitum-config | git mktree`
git branch gitum-config `echo "Save config file" | git commit-tree ${tree}`
Comment 54 Pavel Shilovsky 2012-03-13 20:29:43 MSK
Работал над задачей:
1) Конфигурационный файл сохраняется в пустой ветке.
2) Изменил логику работы: рабочая ветка rebased, которая существует только локально.
3) Сделал команду update более универсальной (позволяет обновить current и patches любыми изменениями ветки rebased).
4) Добавил возможность восстановления только лишь ветки rebased.
5) Исправил ошибки в pull.
Comment 55 Pavel Shilovsky 2012-03-14 18:04:48 MSK
Работал над задачей:
1) Исправлена команды push и clone.
2) Новый порядок аргументов в create.
3) Новое имя по умолчанию для current - mainline.
4) Удалена команда editpatch.
5) Изменено поведение по умолчанию команды restore.
6) Проведено тестирование.
7) Обновлена страничка на wiki.
8) Выпущен новый релиз 0.5.0-alt1 ([#2203] DONE gitum.git=0.5.0-alt1).
Comment 56 Александр Морозов 2012-03-14 21:29:36 MSK
Падает при попытке склонировать локальный репозиторий:
$ gitum clone ./wine-gitum wine-gitum-2
Traceback (most recent call last):
  File "/usr/bin/gitum", line 167, in <module>
    main()
  File "/usr/bin/gitum", line 144, in main
    GitUpstream(repo_path=args['repo-dir'], with_log=True, new_repo=True).clone(args['git-repo'])
  File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 280, in clone
    self._repo.git.fetch('origin')
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 219, in <lambda>
    return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 428, in _call_process
    return self.execute(call, **_kwargs)
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 341, in execute
    raise GitCommandError(command, status, stderr_value)
git.exc.GitCommandError: 'git fetch origin' returned exit status 128: fatal: './wine-gitum' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
Comment 57 Pavel Shilovsky 2012-03-15 10:05:13 MSK
(В ответ на comment #56)
> Падает при попытке склонировать локальный репозиторий:
> $ gitum clone ./wine-gitum wine-gitum-2
> Traceback (most recent call last):
>   File "/usr/bin/gitum", line 167, in <module>
>     main()
>   File "/usr/bin/gitum", line 144, in main
>     GitUpstream(repo_path=args['repo-dir'], with_log=True,
> new_repo=True).clone(args['git-repo'])
>   File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 280,
> in clone
>     self._repo.git.fetch('origin')
>   File "/usr/lib/python2.7/site-packages/git/cmd.py", line 219, in <lambda>
>     return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
>   File "/usr/lib/python2.7/site-packages/git/cmd.py", line 428, in
> _call_process
>     return self.execute(call, **_kwargs)
>   File "/usr/lib/python2.7/site-packages/git/cmd.py", line 341, in execute
>     raise GitCommandError(command, status, stderr_value)
> git.exc.GitCommandError: 'git fetch origin' returned exit status 128: fatal:
> './wine-gitum' does not appear to be a git repository
> fatal: The remote end hung up unexpectedly

На данный момент необходимо указывать полный путь до репозитория:
gitum clone /somepath/wine-gitum wine-gitum2

Поддержку короткого пути записал в TODO, спасибо.
Comment 58 Александр Морозов 2012-03-15 15:23:06 MSK
Сделать push в пустой репозиторий не получилось:
$ mkdir test_repo
$ cd test_repo
$ git init --bare
Initialized empty Git repository in /srv/amorozov/Projects/gitum-test/test_repo/.git/
$ cd ../wine-gitum
$ time -p gitum push --remote "$PWD/../test_repo"
Traceback (most recent call last):
  File "/usr/bin/gitum", line 167, in <module>
    main()
  File "/usr/bin/gitum", line 162, in main
    repo.push(args['remote'])
  File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 365, in push
    self._update_remote(remote)
  File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 393, in _update_remote
    f.write('%s\n%s' % (remote, self._repo.remote(remote).refs[self._patches].object.hexsha))
  File "/usr/lib/python2.7/site-packages/git/remote.py", line 480, in refs
    assert out_refs, "Remote %s did not have any references" % self.name
AssertionError: Remote /srv/amorozov/Projects/gitum-test/wine-gitum/../test_repo did not have any references
Command exited with non-zero status 1
real 1586.30
user 1046.83
sys 65.88
Comment 59 Pavel Shilovsky 2012-03-15 15:29:47 MSK
(В ответ на comment #58)
> Сделать push в пустой репозиторий не получилось:
> $ mkdir test_repo
> $ cd test_repo
> $ git init --bare
> Initialized empty Git repository in
> /srv/amorozov/Projects/gitum-test/test_repo/.git/
> $ cd ../wine-gitum
> $ time -p gitum push --remote "$PWD/../test_repo"
> Traceback (most recent call last):
>   File "/usr/bin/gitum", line 167, in <module>
>     main()
>   File "/usr/bin/gitum", line 162, in main
>     repo.push(args['remote'])
>   File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 365,
> in push
>     self._update_remote(remote)
>   File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 393,
> in _update_remote
>     f.write('%s\n%s' % (remote,
> self._repo.remote(remote).refs[self._patches].object.hexsha))
>   File "/usr/lib/python2.7/site-packages/git/remote.py", line 480, in refs
>     assert out_refs, "Remote %s did not have any references" % self.name
> AssertionError: Remote
> /srv/amorozov/Projects/gitum-test/wine-gitum/../test_repo did not have any
> references
> Command exited with non-zero status 1
> real 1586.30
> user 1046.83
> sys 65.88

gitum push принимает не путь до репозитория, а удалённый гит репо (git-remote).
То есть, нужно сначала
git remote add repo1 $PWD/../test_repo
а потом
gitum push --remote repo1
Comment 60 Александр Морозов 2012-03-15 16:42:57 MSK
Склонировать не получилось:
$ git remote add test_repo "$PWD/../test_repo"
$ gitum push --remote test_repo
$ cd ..
$ gitum clone "$PWD/test_repo" test_repo_clone
Traceback (most recent call last):
  File "/usr/bin/gitum", line 167, in <module>
    main()
  File "/usr/bin/gitum", line 144, in main
    GitUpstream(repo_path=args['repo-dir'], with_log=True, new_repo=True).clone(args['git-repo'])
  File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 287, in clone
    self._repo.git.checkout('-b', self._upstream, 'origin/' + self._upstream)
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 219, in <lambda>
    return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 428, in _call_process
    return self.execute(call, **_kwargs)
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 341, in execute
    raise GitCommandError(command, status, stderr_value)
git.exc.GitCommandError: 'git checkout -b upstream origin/upstream' returned exit status 128: fatal: git checkout: updating paths is incompatible with switching branches.
Did you intend to checkout 'origin/upstream' which can not be resolved as commit?
Comment 61 Pavel Shilovsky 2012-03-15 17:12:58 MSK
(В ответ на comment #60)
> Склонировать не получилось:
> $ git remote add test_repo "$PWD/../test_repo"
> $ gitum push --remote test_repo
> $ cd ..
> $ gitum clone "$PWD/test_repo" test_repo_clone
> Traceback (most recent call last):
>   File "/usr/bin/gitum", line 167, in <module>
>     main()
>   File "/usr/bin/gitum", line 144, in main
>     GitUpstream(repo_path=args['repo-dir'], with_log=True,
> new_repo=True).clone(args['git-repo'])
>   File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 287,
> in clone
>     self._repo.git.checkout('-b', self._upstream, 'origin/' + self._upstream)
>   File "/usr/lib/python2.7/site-packages/git/cmd.py", line 219, in <lambda>
>     return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
>   File "/usr/lib/python2.7/site-packages/git/cmd.py", line 428, in
> _call_process
>     return self.execute(call, **_kwargs)
>   File "/usr/lib/python2.7/site-packages/git/cmd.py", line 341, in execute
>     raise GitCommandError(command, status, stderr_value)
> git.exc.GitCommandError: 'git checkout -b upstream origin/upstream' returned
> exit status 128: fatal: git checkout: updating paths is incompatible with
> switching branches.
> Did you intend to checkout 'origin/upstream' which can not be resolved as
> commit?
А какой вывод git branch в репозиторях repo_test (куда делали push) и wine-gitum(откуда делали push)?
Comment 62 Александр Морозов 2012-03-15 17:19:35 MSK
В wine-gitum:
  gitum-config
  mainline
  master
  patches
* rebased

В test_repo:
  mainline
* master
  patches
Comment 63 Pavel Shilovsky 2012-03-16 11:51:42 MSK
(В ответ на comment #62)
> В wine-gitum:
>   gitum-config
>   mainline
>   master
>   patches
> * rebased
> 
> В test_repo:
>   mainline
> * master
>   patches

Спасибо. Исправил в версии 0.5.1-alt1.
Comment 64 Pavel Shilovsky 2012-03-16 12:58:53 MSK
(В ответ на comment #63)
> (В ответ на comment #62)
> > В wine-gitum:
> >   gitum-config
> >   mainline
> >   master
> >   patches
> > * rebased
> > 
> > В test_repo:
> >   mainline
> > * master
> >   patches
> 
> Спасибо. Исправил в версии 0.5.1-alt1.
Нужно заново сделать push на новой версии, чтобы записать ветку gitum-config в test_repo.
Comment 65 Александр Морозов 2012-03-16 16:15:54 MSK
> Спасибо. Исправил в версии 0.5.1-alt1.
Окей, склонировалось без ошибок.

Задумался вот над таким вопросом. С обычным репозиторием схема работы выглядит так. Есть такие репозитории:
* копия репозитория апстрима wine-pure, ветка master
* репозиторий у нас на сервере eterwine.git, ветка master
* репозиторий разработчика: ветка master, репозиторий на сервере - origin/master
Разработчик в своём репозитории может добавить wine-pure в качестве remote, сделать merge из wine-pure/master в origin/master и сделать push в репозиторий на нашем сервере

В случае gitum:
* копия репозитория апстрима wine-pure, ветка master
* gitum-репозиторий у нас на сервере
* gitum-репозиторий разработчика
После клонирования gitum-репозитория у нас на сервере у разработчика в origin/master оказывается не апстрим, а репозиторий на сервере. Поэтому просто gitum merge делать бесполезно. Надо делать gitum merge с указанием --branch. Но тогда непонятно, зачем в конфиге хранить remote = origin/master, если он работает только для локального репозитория.
Comment 66 Pavel Shilovsky 2012-03-16 18:22:38 MSK
(В ответ на comment #65)
> > Спасибо. Исправил в версии 0.5.1-alt1.
> Окей, склонировалось без ошибок.
> 
> Задумался вот над таким вопросом. С обычным репозиторием схема работы выглядит
> так. Есть такие репозитории:
> * копия репозитория апстрима wine-pure, ветка master
> * репозиторий у нас на сервере eterwine.git, ветка master
> * репозиторий разработчика: ветка master, репозиторий на сервере -
> origin/master
> Разработчик в своём репозитории может добавить wine-pure в качестве remote,
> сделать merge из wine-pure/master в origin/master и сделать push в репозиторий
> на нашем сервере
> 
> В случае gitum:
> * копия репозитория апстрима wine-pure, ветка master
> * gitum-репозиторий у нас на сервере
> * gitum-репозиторий разработчика
> После клонирования gitum-репозитория у нас на сервере у разработчика в
> origin/master оказывается не апстрим, а репозиторий на сервере. Поэтому просто
> gitum merge делать бесполезно. Надо делать gitum merge с указанием --branch. Но
> тогда непонятно, зачем в конфиге хранить remote = origin/master, если он
> работает только для локального репозитория.

Да, тут что-то не то, надо продумать этот момент более тщательно.

Небольшое TODO на следующий релиз:
1) Относительный путь к клонируемому репозиторию для gitum clone.
2) Продумать ситуацию с remote апстрим.
3) Продумать ситуацию с несколькими gitum remote репозиториями (что тоже вполне возможный вариант).
Comment 67 Pavel Shilovsky 2012-05-04 20:13:28 MSK
> Небольшое TODO на следующий релиз:
> 1) Относительный путь к клонируемому репозиторию для gitum clone.
> 2) Продумать ситуацию с remote апстрим.
> 3) Продумать ситуацию с несколькими gitum remote репозиториями (что тоже вполне
> возможный вариант).

Занимался данными задачами.
Comment 68 Pavel Shilovsky 2012-05-05 15:57:22 MSK
Выпустил версию 0.6.0-alt1.
Comment 69 Александр Морозов 2012-05-10 20:32:02 MSK
Я так понимаю, ещё не реализовано:

$ gitum merge --branch origin/master --track
Traceback (most recent call last):
  File "/usr/bin/gitum", line 175, in <module>
    main()
  File "/usr/bin/gitum", line 111, in main
    repo.merge(args['branch'], track_with=track)
  File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 69, in merge
    self._save_urbranch(urbranch)
AttributeError: 'GitUpstream' object has no attribute '_save_urbranch'
Comment 70 Pavel Shilovsky 2012-05-11 12:02:04 MSK
(В ответ на comment #69)
> Я так понимаю, ещё не реализовано:
> 
> $ gitum merge --branch origin/master --track
> Traceback (most recent call last):
>   File "/usr/bin/gitum", line 175, in <module>
>     main()
>   File "/usr/bin/gitum", line 111, in main
>     repo.merge(args['branch'], track_with=track)
>   File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 69,
> in merge
>     self._save_urbranch(urbranch)
> AttributeError: 'GitUpstream' object has no attribute '_save_urbranch'

Нет, это результат поспешной смены названий функций/переменных. Спасибо. Исправил в версии 0.6.1-alt1.
Comment 71 Pavel Shilovsky 2012-05-28 09:08:06 MSK
Выставляю решена.
Comment 72 Денис Баранов 2012-06-01 22:05:24 MSK
Склонировать не получается:
$ git remote -v
etersoft	git.eter:/projects/rx/opennx.git (fetch)
etersoft	git.eter:/projects/rx/opennx.git (push)

$ gitum push --remote etersoft --track

$ gitum clone git.eter:/projects/rx/opennx.git opennx-gitu
Traceback (most recent call last):
  File "/usr/bin/gitum", line 175, in <module>
    main()
  File "/usr/bin/gitum", line 150, in main
    GitUpstream(repo_path=args['repo-dir'], with_log=True, new_repo=True).clone(args['git-repo'])
  File "/usr/lib/python2.7/site-packages/gitupstream/gitupstream.py", line 289, in clone
    self._repo.git.fetch('origin')
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 219, in <lambda>
    return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 428, in _call_process
    return self.execute(call, **_kwargs)
  File "/usr/lib/python2.7/site-packages/git/cmd.py", line 341, in execute
    raise GitCommandError(command, status, stderr_value)
git.exc.GitCommandError: 'git fetch origin' returned exit status 128: ssh: Could not resolve hostname Etersoft/git.eter: Name or service not known
fatal: The remote end hung up unexpectedly

в конфиге .git смущает такая строчка:
[remote "origin"]
	url = /srv/baraka/Projects/RX@Etersoft/OpenNX@Etersoft/git.eter:/projects/rx/opennx.git
	fetch = +refs/heads/*:refs/remotes/origin/*
Comment 73 Pavel Shilovsky 2012-06-04 12:30:31 MSK
Исправил проблему с сетевыми именами. Так же исправил работу с бинарными файлами - поэтому gitum update вероятно сработал с ошибкой (он должен был написать в конце) и изменения из rebased не занеслись в patches - при clone получили сломанный репо. Просьба существующее удалить и всё сделать заново, при этом обращая внимание на вывод программы. Версия 0.6.2-alt1.
Comment 74 Денис Баранов 2012-06-04 20:44:53 MSK
Запушилось и склонировалось.
gitum-0.6.2-alt1
Comment 75 Денис Баранов 2012-06-13 18:06:40 MSK
При создании репозитория gitum игнорирует ветку:
если я указываю так
gitum create --remote origin/ALT/italc2/patchs --upstream upstream --rebased rebased --current mainline --patches patches
он всё равно использует origin/master
Comment 76 Pavel Shilovsky 2012-06-18 11:19:35 MSK
Поправил в 0.6.3-alt1.
Comment 77 Pavel Shilovsky 2012-06-18 11:30:06 MSK
Собрал на git.eter.
Comment 78 Денис Баранов 2012-07-17 16:29:31 MSK
Пока закрываю до возникновения новых проблем, а ещё лучше будем создавать новые баги.
Comment 79 Денис Баранов 2013-01-03 21:47:46 MSK
gitum update некорректно обрабатывает коммиты с русским комментарием.
Comment 80 Vitaly Lipatov 2013-01-04 00:34:12 MSK
Если есть возможность, я бы портировал на python 3. Для нас критерий возможности - это работа в Сизифе (не знаю, каком состоянии модули python 3).
Comment 81 Pavel Shilovsky 2013-01-14 12:44:49 MSK
Перенёс два замечания выше в 8984. Эта бага себя исчерпала, закрываю.