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] 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.
dennisgorelik: (2009)

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

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

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

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

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

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

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

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

[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 03:42 pm (UTC)(link)
> А где у тебя до этого "жила история", я извиняюсь?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[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

[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:53 pm (UTC)(link)
Не, так жить нельзя.
В репозитории должна быть история. Чтобы git diff или там git blame работал.
Без истории - нельзя.

[identity profile] alextutubalin.livejournal.com 2015-02-12 05:55 pm (UTC)(link)
Сначала вы нам расскажите про move semantics, так чтобы даже тупой понял и не делал ошибок.

C++ образца 1991-го года - неплохой язык.

C++14 - ужасен.

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

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

[identity profile] nice-beaver.livejournal.com 2015-02-12 06:15 pm (UTC)(link)
Не спорю, С++ постепенно превращается в монстра. Но всегда можно выделить некий кусок, который дает явные преимущества по сравнению с голым С и на нем программировать. Вменяемые инженеры так и поступают.

[identity profile] alextutubalin.livejournal.com 2015-02-12 06:19 pm (UTC)(link)
Ага, мы такое уже видели с языком Perl.

Когда у меня пяток разработчиков в одном проекте фигачили на перле - мне (начальнику над ними) приходилось работать переводчиком. Потому что перлы друг друга они не понимали.

С современным C++ совершенно аналогичная херня. Язык слишком сложный, сферический в вакууме разработчик знает 5%, думает что знает еще 15 и эти дольки у всех разные.

Page 1 of 3