cranequinier: (65x70)
[personal profile] cranequinier
Это пост для программистов. Вдруг кто чего подскажет.

Делаю новый репозиторий для глубоко приватных C++-ных исходников. Собираюсь его бесплатно хостить на Bitbucket, и доступаться к нему из пары-тройки мест на планете через SourceTree. Выбираю между Git и Mercurial. И вот меня скрутило - исходники, люди и процессы такие, что надо сохранять дату файлов на диске, хоть ты тресни. А оне оба - и Git и Mercurial - по-умолчанию ставят дату последнего слива с сервера. При этом Mercurial довольно просто фиксится примочкой TimestampMod Extension, и начинает даты файлов уважеть, а Git если и фиксится вообще, то как-то через задницу как и всё в Git. Поэтому я слегка скрипя сердцем склоняюсь к Mercurial, хотя знаю его похуже и вообще он какой-то умирающий.

Может я какую-то фигню делаю, а надо хостить где-то ещё, на своём хостинге, использовать SVN и переходить на Жабу? Вправьте мне скорее мозги... Ну чего вообще интересного есть в мире code hosting-а...

P.S. Мечта, конечно, fossil, но его считай что нету.

Date: 2015-02-12 04:59 am (UTC)
dennisgorelik: (2009)
From: [personal profile] dennisgorelik
Ты имеешь ввиду, что на локальной машине нужно выставлять дату последней модификации файла в репозитории?
А зачем?

У меня TortoiseSVN выставляет дату скачивания файла из репозитория (но не меняет дату, если скачивать файл не надо).

Date: 2015-02-12 05:46 am (UTC)
From: [identity profile] cranequinier.livejournal.com
> Ты имеешь ввиду, что на локальной машине нужно выставлять дату последней модификации файла в репозитории?

Я имею ввиду что если файл модифицирован в 2005-м году, то в репозитории хранится его дата модификации, и на новой машине он будет датирован 2005-м годом, а не датой пулла или коммита.

> У меня TortoiseSVN выставляет дату скачивания файла из репозитория

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

Date: 2015-02-12 07:54 am (UTC)
From: [identity profile] alextutubalin.livejournal.com
>> Таким образом если ты залил в SVN проект, живший до этого сколько-то лет, у тебя вся история проекта до заливки полностью потеряна.

А где у тебя до этого "жила история", я извиняюсь? Истории то не было? Даты файлов - это не история, а херня какая-то, они и восстановление из бэкапа не переживают зачастую.

С гитом вот у меня обратная проблема, оно ставит дату коммита такую, какая стоит на локальной машине, где коммит. На одной моей локальной виртуальной девелоперской машине херово идут часики (пока она suspended), в результате типичные даты коммитов там - отстают, бывает смешно.
Надо вот ntpdate по крону там запускать, который год собираюсь.

Соответственно, эту особенность можно попробовать использовать для этой самой твоей "истории", написав скрипт такого плана
- отсортировать файлы по дате "истории"
- охерачить вот таким мегаскриптом:
for file in filelist ; do
set computer-date-to; git add $file; git commit -a -m "$file added"
end

Date: 2015-02-12 07:55 am (UTC)
From: [identity profile] alextutubalin.livejournal.com
При этом, да, конечно, при checkout будут даты checkout.

Но на это, как раз, насрать, потому что тебя в качестве "истории" интересуют даты коммитов (и, да, хорошо бы на сервере проверять, что дата не в прошлом, это наверное делается хуком) и git log file

Date: 2015-02-12 04:01 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
> Но на это, как раз, насрать

На это - безусловно.

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

Но как-то это совсем уж на соплях - в репозитории старых дат не ни в какой форме.

Date: 2015-02-12 05:53 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
Не, так жить нельзя.
В репозитории должна быть история. Чтобы git diff или там git blame работал.
Без истории - нельзя.

Date: 2015-02-12 06:12 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
Имеется ввиду что всё так стартует, а потом - нормальный гит. Тогда у файлов, которые гитом не пуллились, остаются их старые даты.

Date: 2015-02-12 06:19 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
Зачем тебе "старые даты" ты можешь объяснить?

Date: 2015-02-12 06:25 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
Могу. В сравнительно большом и долгоживущем проекте для анализа исходников критично понимание - какой файл бы модифицирован 10 лет назад, а какой - 5 месяцев.

Date: 2015-02-12 06:40 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
git blame ?
upd: и git log, естественно.

Edited Date: 2015-02-12 06:42 pm (UTC)

Date: 2015-02-12 06:54 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
Это же если проект уже давно в гите? А если он давно не в гите, а в файловой системе?

Date: 2015-02-12 06:58 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
Так я и предлагаю его туда перегнать.

Date: 2015-02-12 03:42 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
> А где у тебя до этого "жила история", я извиняюсь?

В сериальных .zip-ах. А так же .tar.gz-ах.

> Истории то не было?

История была, просто её было трудоёмко смотреть. Но можно, и смотрели когда надо. А заливка в git её сносит начисто ващще.

> Даты файлов - это не история, а херня какая-то

Когда больше ничего нет даты вайлов это дико круто.

> они и восстановление из бэкапа не переживают зачастую.

Ну разве что из продвинутого линуксного бэкапа. Из моих бэкапов я регулярно поднимаю файлы с датами типа 1989-й год, второе марта.

> эту особенность можно попробовать использовать для этой самой твоей "истории", написав скрипт такого плана

Я понимаю, что можно написать. Но сам писать не хочу, ишь. Вон для hg оно уже написано довольно чисто и работает.

Может найду ещё для git-а нормальный готовый скрипт, что-то я такое читал.

А мечта, конечно - скрипту скормить миллион "коммитов" в архивах, и чтоб он создал историю в репозитории за далекое прошлое.

Date: 2015-02-12 05:52 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
>> В сериальных .zip-ах. А так же .tar.gz-ах.

С ума сойти. В смысле, вот ты в 1998-м году (не говоря о 2005-м) вот несколько раз на дню зиповал все в архив его откладывал в сторонку?
И не имел возможности удобно посмотреть, когда (и кто - если ты был не один) написал эту строчку и почему?

А как так жить то можно?

>> Я понимаю, что можно написать. Но сам писать не хочу, ишь
Оказывается, у гита есть параметр --date к коммиту.

То есть все вообще просто, вот я пишу тебе скрипт который из твоих сериальных архивов все ухерачит:

for arc in `ls /path/to/archives/`; do
date=`хитрая механика по восстановлению даты из имени файла, раз нет другого, наверное sed справится`
unzip $arc
git add `find . -type f` # это добавит все новые файлы
git commit -a --date=$date -m "$date commited"
end


Date: 2015-02-12 05:57 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
Да, удаление файлов тоже надо обработать, конечно. Но это уже сам давай.

Date: 2015-02-12 06:23 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
Не только удаление, но и аггрегацию - чтоб если архивы были не-diff, миллион одинаковых версий файла не влез в историю. А перемещения файлов из директории в директорию, а переименования, ой...

Даже в крупных корпорациях специально обученые люди при переходе с VCS на VCS обычно на историю забивают. Наверное и я подумаю недельку и-таки забью.

Date: 2015-02-12 06:39 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
>> Даже в крупных корпорациях специально обученые люди при переходе с VCS на VCS обычно на историю забивают. Наверное и я подумаю недельку и-таки забью.

Я делал миграцию из CVS в SVN и из SVN в git своих личных репозиториев. Без проблем. Типа, за день.

Я делал миграцию *и модификацию системы сборки* в нашей мелкой компании (человек 30 разработчиков наверное) - упражнение на неделю где-то, но основная загвоздка была именно в том, что у нас система сборки сама брала из репозитория и сама собирала, а организация тегов в CVS и SVN разная.

То есть это задача такая вполне подъемная и необходимая.

Date: 2015-02-12 06:21 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
> С ума сойти. В смысле, вот ты в 1998-м году (не говоря о 2005-м) вот несколько раз на дню зиповал все в архив его откладывал в сторонку?

Да я его и сейчас каждый день то тут то там несколько раз на дню зипую. Точнее конкретно сейчас 7z-плю - 7z победил на соревновании diff-ующих архиваторов сколько-то лет назад.

Я работаю за зарплату в лидирующем в некоторой области американском производителе софтвера. Если б я пять раз в день не архивировался, раза три-четыре в год исходники за пару дней точно бы грохались.

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

Ну давай проведем эксперимент: достань свои исходники 1995-го года и посмотри кто и когда менял какие строчки. И расскажи насколько удобно это получилось.

Я вот пошел и достал, заняло примерно две минуты - 1994-й год, чтоб с запасом. За строчку не скажу, а даты модификации файлов вижу.

> То есть все вообще просто, вот я пишу тебе скрипт который из твоих сериальных архивов все ухерачит:

Это ж не скрипт, это ж только зародыш.

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

Date: 2015-02-12 06:37 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
>> Если б я пять раз в день не архивировался, раза три-четыре в год исходники за пару дней точно бы грохались.

Вместе с репозиторием? Понимаю!

>> Ну давай проведем эксперимент: достань свои исходники 1995-го года и посмотри кто и когда менял какие строчки. И расскажи насколько удобно это получилось.

95-го не могу, самый старый проект, формально доживший до наших дней - с 97-го года. Я его, правда, закрыл лет 10 как, поэтому он так и остался в CVS, через миграцию CVS-SVN-git не прошел.

Вот сделал cvs checkout, cvs annotate все показывает
===
$ cvs annotate ./src/modules/extra/mod_charset.c | head

....
1.4 (atmail 15-Oct-00): CMDCONST char *
1.4 (atmail 15-Oct-00): add_charset_recode_table(cmd_parms *cmd, charset_dir_t *dc, const char *arg)
1.4 (atmail 15-Oct-00): {
1.4 (atmail 15-Oct-00): char *cset1,*cset2,*table1_2, *table2_1;
...
===

Вот 15 октября нулевого года добавились эти строчки и я даже знаю кем.

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

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

Date: 2015-02-12 06:52 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
>>> Если б я пять раз в день не архивировался, раза три-четыре в год исходники за пару дней точно бы грохались.
>Вместе с репозиторием? Понимаю!

Скорее даже не с репозиторием, а с каким-нибудь кривым merge-м. Который сделает в штате Коннектикут человек, которого я никогда не видел. Или ещё с какой фигнёй. Вот например у меня несколько моих собственных файлов в фирменом репозитории, которые кроме меня никто никогда наверное не трогал, имеют битые не-юниксные и не-видовзные CRLF-ы. Например одни CR-ы - и это ещё лёгкий случай.

Когда я первый раз ставил Git клиент в Windows, и увидел что он по-умолчанию хочет делать автоматическую трансляцию CRLF-ов туда-сюда, я только чудом ограничил свою вокализацию непонятными окрестным англосаксам чисто русскими словами...

> 95-го не могу, самый старый проект, формально доживший до наших дней - с 97-го года.

Если ты не можешь достать из рукава исходник старше 15 лет - значит половина твоей истории уже исчезла. А моей - не исчезла. Потому что она в zip-ах.

> Но с учетом того, что история всей жизни будет в человеческом, легко клонируемом и все такое формате - почему нет.

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

Date: 2015-02-12 07:04 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
>> Если ты не можешь достать из рукава исходник старше 15 лет

Вот с 97-го могу достать из репозитория. С 93-го могу из тех самых зипов.
87-90-й годы точно пропали (оно было на дискетах, я на них посмотрел и выкинул нахер).
91-92 - пропали скорее всего (надо смотреть в ящике с сидюками).

>> Скорее даже не с репозиторием, а с каким-нибудь кривым merge-м

Не, не понимаю. Твой то коммит останется.


Date: 2015-02-12 07:10 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
>>> Скорее даже не с репозиторием, а с каким-нибудь кривым merge-м
>Не, не понимаю. Твой то коммит останется.

А фиг его знает, останется он или нет.
Например файлы неаккуратно перенесут из одной директории в другую, и у них история обнулится. Или будет коренной апгрейд VCS, который что-то случайно потрёт. Или вообще переезд на новую платформу. Это всё реальные случаи.

Не помню чтоб я видел когда-нибудь в конторских VCS-ах больше трёх лет истории, хотя иногда пытался её оттуда достать. Но и настоящих крэшей тоже не помню - вроде оно всегда живо в режиме "зачекинить-зарефрешить".

Date: 2015-02-12 07:17 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
>>Или будет коренной апгрейд VCS, который что-то случайно потрёт

Вот git, кстати, это интересная история, которой еще не было.

Было же как: централизованный репо, один на контору, который как-то бэкапится. Или несколько репо под разные проекты, но все равно - центральные.

А вот что что происходит в конторах, когда у них хотя бы лет 5 как живут распределенные репозитории и у каждого разработчика есть свой локальный - безумно интересно будет еще через 5 лет посмотреть.

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

Date: 2015-02-12 07:24 pm (UTC)
From: [identity profile] alextutubalin.livejournal.com
Заглянул в те зипы.

А там есть RCS/
То есть минимум с 94-го года могу достать историю (не помню, правда, есть ли annotate у rcs)

21 год с version control, епта!

Date: 2015-02-12 08:08 pm (UTC)
From: [identity profile] cranequinier.livejournal.com
Все эти разговоры меня возбудили попробовать воткнуть в гит что смогу из своей исходниковой истории.

Теперь шанс 50 на 50 - или воткну, или забью.

Profile

cranequinier: (Default)
cranequinier

March 2020

S M T W T F S
1234567
891011121314
15161718192021
22 232425262728
293031    

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 29th, 2025 04:50 pm
Powered by Dreamwidth Studios