cranequinier: (65x70)
cranequinier ([personal profile] cranequinier) wrote2015-02-11 09:33 pm

Git vs Mercurial чтоб сохранять timestamp-ы

Это пост для программистов. Вдруг кто чего подскажет.

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

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

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

[identity profile] duginov.livejournal.com 2015-02-12 04:53 am (UTC)(link)
А c C++ кодом в какой среде ворочаешься?

Если в Visual Studio, так в него интегрирован TFS-клиент, которым MS предлагает ходить в бесплатный (для маленьких коллективов) репозиторий, который у них же хостится. Называется Visual Studio Online, хотя должно быть "TFS in Azure".

От только хрен знает, какие таймстэмпы TFS ставит на слитые файлы. Вполне возможно, что тоже время слива, лень проверять...

[identity profile] rezkiy.livejournal.com 2015-02-12 05:15 am (UTC)(link)
локальный TFS на неизмененные файлы ставит дату последнего чекина, независимо от того когда я скачал файл себе.

[identity profile] cranequinier.livejournal.com 2015-02-12 05:48 am (UTC)(link)
То-есть они тоже тупые удаки...

[identity profile] rezkiy.livejournal.com 2015-02-15 02:24 am (UTC)(link)
я честно говоря не врубился, как надо-то? (редактирую: я так понял, что как раз TFSное поведение это то что надо...)
Edited 2015-02-15 02:26 (UTC)

[identity profile] cranequinier.livejournal.com 2015-02-12 05:39 am (UTC)(link)
> А c C++ кодом в какой среде ворочаешься?

В Windows. VS2008 и куча всего ещё в скриптах.

> Если в Visual Studio, так в него интегрирован TFS-клиент

В 2008 не интегрирован, вроде. Хмм... Хотя вроде втыкается.

Спасибо - надо изучить. Я в целом TFS не люблю, но бесплатный хостиг и нативность для виндов того стоят.

[identity profile] cranequinier.livejournal.com 2015-02-12 03:56 pm (UTC)(link)
Изучание показало, что TFS - центрально-серверная система образца середины 19-го века.

Тогда уж лучше сразу SVN заюзать.

[identity profile] onanim.wordpress.com (from livejournal.com) 2015-02-12 04:53 am (UTC)(link)
Sigh.

https: //git. wiki. kernel. org/ index.php/ExampleScripts#Setting_the_timestamps_of_the_files_to_the_commit_timestamp_of_the_commit_which_last_touched_them

"For example, setting the timestamps of the files to the time when they were last updated by a commit, is usually idiotic. It breaks "make", and it completely breaks down when multiple machines are involved, since they do not necessarily share a common time source."

Ну и там дальше собственно скрипт на перле, который вешать как hook.

[identity profile] cranequinier.livejournal.com 2015-02-12 05:43 am (UTC)(link)
> setting the timestamps of the files to the time when they were last updated by a commit, is usually idiotic. It breaks "make",

Не буду тут повторять все те добрые слова, которые сказаны в И-нете в адрес авторов VCS, ориентированной не на голову, а на make. Тысячи их.

> Ну и там дальше собственно скрипт на перле, который вешать как hook.

Эээ... В какое место вешать? Где хотя бы минимальный хелп? И что будет в Виндах с бросающимися в глаза в этом скрипте юниксными командами?

[identity profile] onanim.wordpress.com (from livejournal.com) 2015-02-12 11:23 pm (UTC)(link)
http: //git-scm. com /book/en/v2/ Customizing-Git-Git-Hooks

man githooks

Думается, post-merge надо попробовать.

"post-merge
This hook is invoked by git merge, which happens when a git pull is
done on a local repository. The hook takes a single parameter, a status
flag specifying whether or not the merge being done was a squash merge.
This hook cannot affect the outcome of git merge and is not executed,
if the merge failed due to conflicts.

This hook can be used in conjunction with a corresponding pre-commit
hook to save and restore any form of metadata associated with the
working tree (eg: permissions/ownership, ACLS, etc). See
contrib/hooks/setgitperms.perl for an example of how to do this."

(Но с вендой это будет забавная мастурбация, да-с (у нее вообще понятие mod time имеется? видимо, вместо перла какой-нибудь VBS юзать)... но если уж хочется непременно git - нет ничего невыполнимого).

[identity profile] onanim.wordpress.com (from livejournal.com) 2015-02-12 11:37 pm (UTC)(link)
(подумав) или, возможно, post-checkout.
"post-checkout
This hook is invoked when a git checkout is run after having updated
the worktree. The hook is given three parameters: the ref of the
previous HEAD, the ref of the new HEAD (which may or may not have
changed), and a flag indicating whether the checkout was a branch
checkout (changing branches, flag=1) or a file checkout (retrieving a
file from the index, flag=0). This hook cannot affect the outcome of
git checkout."

Whatever works.
dennisgorelik: (2009)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[identity profile] alextutubalin.livejournal.com 2015-02-12 05:52 pm (UTC)(link)
>> В сериальных .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


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

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

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

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

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

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

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

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

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

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

[identity profile] nice-beaver.livejournal.com 2015-02-12 04:51 pm (UTC)(link)
Что вы хотели от поделки аутиста Торвальдса? Человека, который предпочитает С вместо С++?
Edited 2015-02-12 16:51 (UTC)

[identity profile] cranequinier.livejournal.com 2015-02-12 04:59 pm (UTC)(link)
> Что вы хотели от поделки аутиста Торвальдса?

Ну да, судя по каментам про timestamp-ы в git-е он серьезно долбанутый. Впрочем и судя по десктопному Линуксу тоже.

> Человека, который предпочитает С вместо С++?

Все нормальные люди "предпочитают С вместо С++". Очевидно, что C - суперъязык всех времен и народов, а С++ - полупропеченое говно.

[identity profile] nice-beaver.livejournal.com 2015-02-12 05:25 pm (UTC)(link)
Троллите? Ну-ну.

[identity profile] cranequinier.livejournal.com 2015-02-12 05:33 pm (UTC)(link)
Правду говорю.

[identity profile] nice-beaver.livejournal.com 2015-02-12 05:50 pm (UTC)(link)
Ну расскажите же мне, как написать простейший контейнер на Си, так чтобы он был typesafe

(no subject)

[identity profile] nice-beaver.livejournal.com - 2015-02-12 18:15 (UTC) - Expand

(no subject)

[identity profile] nice-beaver.livejournal.com - 2015-02-12 18:31 (UTC) - Expand

(no subject)

[identity profile] nice-beaver.livejournal.com - 2015-02-12 18:44 (UTC) - Expand

(no subject)

[identity profile] nice-beaver.livejournal.com - 2015-02-12 23:33 (UTC) - Expand

(no subject)

[identity profile] nice-beaver.livejournal.com - 2015-02-12 18:32 (UTC) - Expand

(no subject)

[identity profile] nice-beaver.livejournal.com - 2015-02-12 18:30 (UTC) - Expand

(no subject)

[identity profile] nice-beaver.livejournal.com - 2015-02-12 18:36 (UTC) - Expand