cranequinier (
cranequinier) wrote2015-02-11 09:33 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Entry tags:
Git vs Mercurial чтоб сохранять timestamp-ы
Это пост для программистов. Вдруг кто чего подскажет.
Делаю новый репозиторий для глубоко приватных C++-ных исходников. Собираюсь его бесплатно хостить на Bitbucket, и доступаться к нему из пары-тройки мест на планете через SourceTree. Выбираю между Git и Mercurial. И вот меня скрутило - исходники, люди и процессы такие, что надо сохранять дату файлов на диске, хоть ты тресни. А оне оба - и Git и Mercurial - по-умолчанию ставят дату последнего слива с сервера. При этом Mercurial довольно просто фиксится примочкой TimestampMod Extension, и начинает даты файлов уважеть, а Git если и фиксится вообще, то как-то через задницукак и всё в Git. Поэтому я слегка скрипя сердцем склоняюсь к Mercurial, хотя знаю его похуже и вообще он какой-то умирающий.
Может я какую-то фигню делаю, а надо хостить где-то ещё, на своём хостинге, использовать SVNи переходить на Жабу? Вправьте мне скорее мозги... Ну чего вообще интересного есть в мире code hosting-а...
P.S. Мечта, конечно, fossil, но его считай что нету.
Делаю новый репозиторий для глубоко приватных C++-ных исходников. Собираюсь его бесплатно хостить на Bitbucket, и доступаться к нему из пары-тройки мест на планете через SourceTree. Выбираю между Git и Mercurial. И вот меня скрутило - исходники, люди и процессы такие, что надо сохранять дату файлов на диске, хоть ты тресни. А оне оба - и Git и Mercurial - по-умолчанию ставят дату последнего слива с сервера. При этом Mercurial довольно просто фиксится примочкой TimestampMod Extension, и начинает даты файлов уважеть, а Git если и фиксится вообще, то как-то через задницу
Может я какую-то фигню делаю, а надо хостить где-то ещё, на своём хостинге, использовать SVN
P.S. Мечта, конечно, fossil, но его считай что нету.
no subject
Если в Visual Studio, так в него интегрирован TFS-клиент, которым MS предлагает ходить в бесплатный (для маленьких коллективов) репозиторий, который у них же хостится. Называется Visual Studio Online, хотя должно быть "TFS in Azure".
От только хрен знает, какие таймстэмпы TFS ставит на слитые файлы. Вполне возможно, что тоже время слива, лень проверять...
no subject
no subject
no subject
no subject
В Windows. VS2008 и куча всего ещё в скриптах.
> Если в Visual Studio, так в него интегрирован TFS-клиент
В 2008 не интегрирован, вроде. Хмм... Хотя вроде втыкается.
Спасибо - надо изучить. Я в целом TFS не люблю, но бесплатный хостиг и нативность для виндов того стоят.
no subject
Тогда уж лучше сразу SVN заюзать.
no subject
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.
no subject
Не буду тут повторять все те добрые слова, которые сказаны в И-нете в адрес авторов VCS, ориентированной не на голову, а на make. Тысячи их.
> Ну и там дальше собственно скрипт на перле, который вешать как hook.
Эээ... В какое место вешать? Где хотя бы минимальный хелп? И что будет в Виндах с бросающимися в глаза в этом скрипте юниксными командами?
no subject
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 - нет ничего невыполнимого).
no subject
"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.
no subject
А зачем?
У меня TortoiseSVN выставляет дату скачивания файла из репозитория (но не меняет дату, если скачивать файл не надо).
no subject
Я имею ввиду что если файл модифицирован в 2005-м году, то в репозитории хранится его дата модификации, и на новой машине он будет датирован 2005-м годом, а не датой пулла или коммита.
> У меня TortoiseSVN выставляет дату скачивания файла из репозитория
Таким образом если ты залил в SVN проект, живший до этого сколько-то лет, у тебя вся история проекта до заливки полностью потеряна.
no subject
А где у тебя до этого "жила история", я извиняюсь? Истории то не было? Даты файлов - это не история, а херня какая-то, они и восстановление из бэкапа не переживают зачастую.
С гитом вот у меня обратная проблема, оно ставит дату коммита такую, какая стоит на локальной машине, где коммит. На одной моей локальной виртуальной девелоперской машине херово идут часики (пока она suspended), в результате типичные даты коммитов там - отстают, бывает смешно.
Надо вот ntpdate по крону там запускать, который год собираюсь.
Соответственно, эту особенность можно попробовать использовать для этой самой твоей "истории", написав скрипт такого плана
- отсортировать файлы по дате "истории"
- охерачить вот таким мегаскриптом:
for file in filelist ; do
set computer-date-to; git add $file; git commit -a -m "$file added"
end
no subject
Но на это, как раз, насрать, потому что тебя в качестве "истории" интересуют даты коммитов (и, да, хорошо бы на сервере проверять, что дата не в прошлом, это наверное делается хуком) и git log file
no subject
На это - безусловно.
Собственно есть простой путь - на каждой машине в директорию гитового репозитория разворачивается .zip архив со всеми датами файлов. Поскольку гит смотрит только хэши, а с ~~последней версии не портит существующие даты пуллом, всё как бы становится сравнительно хорошо, можно дальше работать.
Но как-то это совсем уж на соплях - в репозитории старых дат не ни в какой форме.
no subject
В репозитории должна быть история. Чтобы git diff или там git blame работал.
Без истории - нельзя.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
В сериальных .zip-ах. А так же .tar.gz-ах.
> Истории то не было?
История была, просто её было трудоёмко смотреть. Но можно, и смотрели когда надо. А заливка в git её сносит начисто ващще.
> Даты файлов - это не история, а херня какая-то
Когда больше ничего нет даты вайлов это дико круто.
> они и восстановление из бэкапа не переживают зачастую.
Ну разве что из продвинутого линуксного бэкапа. Из моих бэкапов я регулярно поднимаю файлы с датами типа 1989-й год, второе марта.
> эту особенность можно попробовать использовать для этой самой твоей "истории", написав скрипт такого плана
Я понимаю, что можно написать. Но сам писать не хочу, ишь. Вон для hg оно уже написано довольно чисто и работает.
Может найду ещё для git-а нормальный готовый скрипт, что-то я такое читал.
А мечта, конечно - скрипту скормить миллион "коммитов" в архивах, и чтоб он создал историю в репозитории за далекое прошлое.
no subject
С ума сойти. В смысле, вот ты в 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
no subject
(no subject)
(no subject)
no subject
Да я его и сейчас каждый день то тут то там несколько раз на дню зипую. Точнее конкретно сейчас 7z-плю - 7z победил на соревновании diff-ующих архиваторов сколько-то лет назад.
Я работаю за зарплату в лидирующем в некоторой области американском производителе софтвера. Если б я пять раз в день не архивировался, раза три-четыре в год исходники за пару дней точно бы грохались.
> И не имел возможности удобно посмотреть, когда (и кто - если ты был не один) написал эту строчку и почему?
Ну давай проведем эксперимент: достань свои исходники 1995-го года и посмотри кто и когда менял какие строчки. И расскажи насколько удобно это получилось.
Я вот пошел и достал, заняло примерно две минуты - 1994-й год, чтоб с запасом. За строчку не скажу, а даты модификации файлов вижу.
> То есть все вообще просто, вот я пишу тебе скрипт который из твоих сериальных архивов все ухерачит:
Это ж не скрипт, это ж только зародыш.
Понятно, что полный скрипт тоже можно написать, но это минимум пять часов работы, скорее десять.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
no subject
Ну да, судя по каментам про timestamp-ы в git-е он серьезно долбанутый. Впрочем и судя по десктопному Линуксу тоже.
> Человека, который предпочитает С вместо С++?
Все нормальные люди "предпочитают С вместо С++". Очевидно, что C - суперъязык всех времен и народов, а С++ - полупропеченое говно.
no subject
no subject
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)