[Пятничное]


Всегда хотел сделать свой график активности пользовательского профиля на Гитхабе. Например, выкладывать коммиты каждый день так, чтобы через год этот график превратился в какую-нибудь картинку, пусть и с ограничением по размерам в 52?7 квадратиков-пикселей (52 недели в году ? 7 дней в неделе).


Проблема была в том, что даже при полной автоматизации процесса всё равно ждать целый год. А тут я почитал документацию Гитхаба и понял, что задача решается проще и более того — за один раз. А значит, надо делать не откладывая. Обычно названия проектам придумывать сложно, но тут оно пришло само. Кай рисовал льдинками, а Герда рисует коммитами!


График коммитов на Гитхабе в виде картинки


Как это работает


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


А поскольку Гитхаб доверяет локальным датам, указанным в коммите, можно отправить ему сколько угодно коммитов с какими угодно датами:


echo "С Новым годом тебя, часовой пояс +3!" >> gerda.md
git add gerda.md
git commit -m "Правки к Новому году" --date="0001-01-01T00:00:00+0300"

Таким образом, наша задача состоит в автоматизации самого процесса создания коммитов с нужными датами. Говоря проще, надо написать скрипт, который генерирует скрипт, который создаёт нужные коммиты. По пути ещё надо не забыть, что график профиля использует недели с воскресным, а не понедельничным первым днём.


Лучше всего скриптам скармливать картинки в более-менее человекочитаемом формате, например, массивом строк или вообще реальные файлы изображений. Я для простоты парсинга сделал строки. Гитхаб отображает пять разных оттенков цвета в графике, чем темнее оттенок, тем больше активность пользователя в заданный день. Возьмём для примера три:


  • пробел ? — отсутствие оттенка — никакой активности в заданный день,
  • звёздочка * — светлый оттенок — средняя активность в заданный день,
  • решётка # — тёмный оттенок — большая активность в заданный день.

Например, напишем слово „ПРИВЕТ“ (используем звёздочку в качестве антиалиасинга для „плавных“ переходов):


$commits = [
    /* columns
    '      10>|      20>|      30>|      40>|      50>|  ' < exactly 52 characters */
    ' #######  #####*   #     #  #####   ######  ####### ',  // Sun
    ' #     #  #     #  #    ##  #    #  #          #    ',  // Mon
    ' #     #  #     #  #   # #  #    *  #          #    ',  // Tue
    ' #     #  #####*   #  #  #  #####   #####      #    ',  // Wed
    ' #     #  #        # #   #  #    #  #          #    ',  // Thu
    ' #     #  #        ##    #  #    #  #          #    ',  // Fri
    ' #     #  #        #     #  #####*  ######     #    ',  // Sat
];

Лучше оставлять по паре недель (пробелов) слева и справа — чтобы меньше мешала текущая активность.


Теперь самое сложное — разобрать этот массив, соотнеся каждый символ в нём с каким-то определённым днём. У меня получилось так:


/**
 * Генерация набора коммитов.
 *
 * @param  string[]   $map          Карта коммитов в виде массива из 7 строк по 52 символа каждая
 * @param  \DateTime  $firstSunday  Дата последнего воскресенья год назад
 * @return array
 */
function generateCommits($map, $firstSunday)
{
    $commits = [];
    $count = 7 * 52;
    $date = clone $firstSunday;

    // Идём по всем символам карты коммитов, вычисляя неделю и день недели
    for ($day = 0, $weekDay = 0; $day < $count; $day++) {
        $week = intval($day / 7);
        $char = substr($map[$weekDay], $week, 1);
        if ($char !== ' ') {
            $commits[$date->format('Y-m-d')] = $char === '#' ? 20 : 10;
        }
        // Переходим к следующему дню
        $date->add(new DateInterval('P1D'));
        $weekDay = ($weekDay + 1) % 7;
    }

    return $commits;
}

В результате получаем ассоциативный массив (словарь), где ключ — день недели, а значение — количество коммитов, необходимых в этот день:


$commits = [
    // ...
    '2016-01-31' => 10,
    '2016-02-01' => 20,
    '2016-02-02' => 20,
    '2016-02-03' => 10,
    // ...
]

Дальше всё совсем просто: проходим по этому словарю и пишем в результирующий шелл-скрипт нужное количество коммитов для каждого дня (для часового пояса я использовал московское время). В качестве подопытного файла используем маркдаун-документ, в текст которого с каждым коммитом добавляем день или какую-нибудь другую информацию (у меня это маркированный список с номером коммита в этот день):


git init

echo "# Gerda" > gerda.md

echo "\n## 2016-01-31" >> gerda.md
    echo "* Gerda №1" >> gerda.md
    git add gerda.md
    git commit -m "Gerda №1" --date="2016-01-31T12:00:00+0300"
    # ... так 10 раз ...

echo "\n## 2016-02-01" >> gerda.md
    echo "* Gerda №1" >> gerda.md
    git add gerda.md
    git commit -m "Gerda №1" --date="2016-02-01T12:00:00+0300"
    # ... так 20 раз ...

echo "\n## 2016-02-02" >> gerda.md
    echo "* Gerda №1" >> gerda.md
    git add gerda.md
    git commit -m "Gerda №1" --date="2016-02-02T12:00:00+0300"
    # ... так 20 раз ...

echo "\n## 2016-02-03" >> gerda.md
    echo "* Gerda №1" >> gerda.md
    git add gerda.md
    git commit -m "Gerda №1" --date="2016-02-03T12:00:00+0300"
    # ... так 10 раз ...

Программирование логики готово. Вынесем все нужные настройки в один файл settings.php, чтобы отделить данные от логики:


// Streak graph picture
$commits = [ ... ];

// Repository origin
$origin = 'https://github.com/maximal/gerda.git';

// Output shell file
$commandFile = 'repo' . DIRECTORY_SEPARATOR . 'make-commits.sh';

Разумеется, чтобы Гитхаб понял, от какого пользователя были произведены коммиты, в настройках Гита должны стоять ваш логин и почтовый ящик:


# ~/.gitconfig
[user]
    name  = my_github_username
    email = my_github_email@ya.ru
### ...

Придумываем нужный нам график активности. Пишем желаемую картинку в настройках. Запускаем то, что получилось:


Валидация


Ой, пятница от радости выпрыгнула за ограничение в 52 символа. Поправим:


Генерация скрипта с коммитами


Скрипт с коммитами создан, запустим его:


cd repo
./make-commits.sh

По окончании работы скрипта (как правило, там пара тысяч коммитов: придётся подождать минутку), Гитхаб спросит ваш пароль. Вводить пароли в чужие (а иногда и в свои) скрипты некруто, поэтому, если хотите, можете завершить скрипт на этом шаге и запушить потом самостоятельно (в сгенерированном скрипте честно-честно только команда git push):


git remote add origin https://github.com/<MY>/<REPO>.git
git push -u origin master -f

Ждём пару минут (разумно полагать, что эти данные у Гитхаба кешируются), обновляем страницу профиля.


Готово.


Ссылки


Весь исходный код и его описание лежат на (сюрприз!) Гитхабе: https://github.com/sijeko/gerda
Будут пулреквесты — заходите на огонёк.


Живая картинка активности на примере моего профиля: https://github.com/maximal


Минусы


Чего программа не умеет, и что можно доработать:


  • Скрипт не учитывает уже существующую Гитхаб-активность, поэтому при плотной текущей занятости картинка,
    скорее всего, не получится, или, в лучшем случае, будет смазана.
  • Вся „активность“ получается сконцентрированной в одном репозитории и в одном файле,
    поэтому если ваша цель — максимальная скрытность, этот скрипт — не вариант.
  • Если надо перерисовать картинку, репозиторий придётся сначала удалить на Гитхабе
    и потом создать новый с таким же именем — не очень удобно.
  • Программа распознаёт три градации цвета, Гитхаб отображает пять — можно улучшить.
  • Фиксированный часовой пояс (+3:00, московское время) — можно сделать конфигурируемым.
  • Для коммитов используется пользователь по умолчанию из конфигурации Гита — можно сделать изменяемым в наших настройках.
Поделиться с друзьями
-->

Комментарии (36)


  1. SerafimArts
    13.01.2017 13:28
    +8

    Как редко на хабре можно увидеть вменяемый php код, который не заслуживает ни строчки критики (ну разве только добавить типизацию). Прямо только за это можно говорить что вы — молодец.


    UPD. Ой, открыл репозиторий, забираю свои слова обратно. Особая дичь в файлике gerda.php. Но всё равно это лучше, чем у большинства.


    1. MaximAL
      13.01.2017 13:36
      +1

      Я не заморачивался с ООП, поэтому преднамеренно использовал слово „скрипт“ с самого начала.


      Типизацию я сам люблю, у нас в компании почти запрещено использовать двойные равно.


      1. SerafimArts
        13.01.2017 13:53
        -13

        Да дело не в двойных равно. 99% всех сюда писавших не заморчаиваются даже по использованию стандартов. Я увидел код и обрадовался, мол вот, код отформатирован по PSR, можно даже читать.


        Ан нет, открыл репу на гитхабе с глобальными константами, с выравниванием табами, без поддержки композера и докой на русском языке (т.е. явно видно что написан по-быстрому за пару часиков). Но это всё равно, повторюсь, лучше, нежели у тех, кто делает публикации, приводя в качестве примера глобалсы и стиль php начала двухтысячных.


        Если подытоживать — ваш код вполне читаемый, но одноразовый и не расширяемый. Туда не всунуть ни симфонёвую консоль, ни поставить локально в систему, ну т.е. никуда. Но в качестве примера вполне годится.


        1. HashCode
          13.01.2017 14:00
          +12

          ваш код вполне читаемый, но одноразовый и не расширяемый. Туда не всунуть ни симфонёвую консоль, ни поставить локально в систему, ну т.е. никуда.


          Вы уверены, что все это нужно для наколеночного скрипта? Тут ведь главная идея — не код на PHP показать.


          1. MaximAL
            13.01.2017 14:01
            +2

            Разумеется, главная идея — это показать алгоритм, а не код, вы правы.


        1. MaximAL
          13.01.2017 14:09
          +16

          Ну, по пунктам:


          • Этот код и так был написан за пару часиков.


          • По поводу PSR. Я использую PSR-2T — PSR-2 со смарт-табуляцией.
            Для меня это дело принципа. Моё мнение по этому вопросу вот такое и пока что не менялось:
            https://habrahabr.ru/post/308974/#comment_9783180


          • Глобальная константа там всего одна — это версия скрипта, ну вы серьёзно?!


          • Первая дока на русском языке преднамеренно, потому что предназначена для русскоязычной аудитории (поэтому и пост на Хабре, а не на чём-то англоязычном, хотя я и говорю по-английски). Если будет время (у меня ещё есть работа) — будет дока и на других языках.


          • По поводу композер-пакета полностью согласен — можно сделать.


          1. VioletGiraffe
            13.01.2017 15:51
            -3

            Если бы карма позволяла — люто заплюсовал бы. Отступы табами, выравнивание пробелами, остальное — для мазохистов (если в личном проекте) и садистов (если это кто-то другой ещё и поддерживать должен).


            1. MaximAL
              13.01.2017 16:29
              +2

              А вы тут не плюсуйте, это слишком локальная тусовка; если пишете на PHP, присоединяйтесь к стандарту, который я упомянул, давайте опишем его нормально, сделаем стиль для кодснифера и тому подобное :-)


              1. VioletGiraffe
                13.01.2017 16:45
                +1

                C++, в основном, но дело нужное и полезное :)


          1. TimsTims
            14.01.2017 01:15
            +2

            И снова я вас поддержу)


        1. MamontsevDS
          13.01.2017 14:27
          +1

          Почему многим не нравится выравнивание табами? Удобнее пробелов же…


          1. MamontsevDS
            13.01.2017 14:41
            +4

            Отступы, конечно же, я хотел написать отступы, а не выравнивание.


          1. Calc
            13.01.2017 15:45
            +1

            Это как то исторически.
            Когда работаешь в разных средах, на разных компах и не своих в том числе + консоли, то «прыгание табов» просто раздражает, где то это 2 пробела, где то 4, где то 8, встречал и 3 пробела.
            Ну а пробел это пробел, лишь бы шрифт был моноширинный (хотя должно быть пофиг, они же ведущие)


            1. Stepanow
              13.01.2017 17:06

              Прыгает только когда половина начальных отступов пробелами а половина табами. Как говорится — взболтать, но не смешивать.


          1. PsyHaSTe
            13.01.2017 16:48
            +3

            Потому что пока что даже MSVS2017RC не умеет правильно определять, когда уместно использовать пробел, а когда — таб. Есть всякие платные расширения, но платить за то, что возможно кто-то захочет изменить ширину таба… Проще поставить в all languages «insert 4 spaces instead of tab», поправить для css/js на «2 пробела» и быть уверенным, что на всех платформах отображаться будет одинаково. Правда, бекспейсом становится пользоваться неудобнее, но тут уж шашечки или ехать.


            1. Sirikid
              14.01.2017 03:16
              +4

              Вроде бы у тех кто пишет под Windows не особо много выбора, но все равно выглядит как пожирание кактуса. (IDE которая не умеет удалять по n пробелов в начале строки, смишно.)


  1. zvirusz
    13.01.2017 14:00
    +9

    https://github.com/ben174/git-draw
    Это удобнее. Простите :)


    1. MaximAL
      13.01.2017 14:13
      +2

      О, круто, спасибо!


      (А этот пост больше про алгоритм.)


  1. patricksafarov
    13.01.2017 14:00
    -4

    Такая же идея в голову приходила… но мысль, что ради этого придется целый год комитить (пусть даже и не вручную) отбила желание


  1. mnv
    13.01.2017 15:20
    +8

    Супер. Я подготовил шаблон для тех, кто работает на Бали:


    для тех, кто работает на Бали
    $commits = [
        '                                                                        ' // Sun
        '  ###  #  #  ##    ###   ##  #  # #  #  ##   ##   ##   ##     ### #   # ' // Mon
        ' #     # #     #  #   # #  # #  # #  # #  # #  # #       #   #  # #  ## ' // Tue
        ' #     ##    ###    ##  #  #  ### #### #  # ###  ###   ###   #  # # # # ' // Wed
        ' #     # #  #  #  #   # #  #    # #  # #  # #    #  # #  #   #  # ##  # ' // Thu
        '  ###  #  #  ####  ###   ##     # #  #  ##   ##   ##   #### #   # #   # ' // Fri
        '                                                                        ' // Sat
    ];


    1. MaximAL
      13.01.2017 15:22

      Норм!


  1. dmrt
    13.01.2017 15:34
    +5

    Нет ничего более интересного, чем использовать что-то не по назначению.


    1. linuxshaman
      13.01.2017 16:27

      Пятница же


      1. vershov
        13.01.2017 16:51
        -3

        А еще можно кушать суп вилкой… пятница же )


  1. raidhon
    13.01.2017 16:51
    +11

    ............................................________
    ....................................,.-‘”...................``~.,
    .............................,.-”..................................."-.,
    .........................,/...............................................”:,
    .....................,?......................................................\,
    .................../...........................................................,}
    ................./......................................................,:`^`..}
    .............../...................................................,:”........./
    ..............?.....__.........................................:`.........../
    ............./__.(....."~-,_..............................,:`........../
    .........../(_....”~,_........"~,_....................,:`........_/
    ..........{.._$;_......”=,_......."-,_.......,.-~-,},.~”;/....}
    ...........((.....*~_.......”=-._......";,,./`..../”............../
    ...,,,___.\`~,......"~.,....................`.....}............../
    ............(....`=-,,.......`........................(......;_,,-”
    ............/.`~,......`-...............................\....../\
    .............\`~.*-,.....................................|,./.....\,__
    ,,_..........}.>-._\...................................|..............`=~-,
    .....`=~-,_\_......`\,.................................\
    ...................`=~-,,.\,...............................\
    ................................`:,,...........................`\..............__
    .....................................`=-,...................,%`>--==``
    ........................................_\..........._,-%.......`\
    ...................................,<`.._|_,-&``................`\


    1. raidhon
      13.01.2017 17:00

      Спасибо за минус автор!
      Тоже веселюсь по пятницам.


      1. MaximAL
        13.01.2017 17:10
        +5

        Эээээ? Я не ставил, за что?
        (Плюсанул, только не расстраивайтесь.)


        1. raidhon
          13.01.2017 17:43
          -5

          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶11¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1___1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶__¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶1_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶¶1_1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶¶¶1_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶¶¶¶__¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1__¶¶¶¶¶¶1_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1__¶¶¶¶¶¶1_1¶¶¶¶¶¶11____1¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__1¶¶¶¶¶¶1__¶¶11_____1111__¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1__¶¶¶¶¶¶¶________11¶¶¶¶¶¶¶1_1¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1_1¶¶¶¶¶¶¶1_1¶1_¶¶¶¶¶¶¶¶¶¶¶¶¶_1¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶__1¶¶¶¶¶¶¶¶¶_1¶__¶¶¶¶¶¶¶¶¶¶¶1__1¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶¶¶¶¶¶¶¶¶¶¶¶1_11111111____1__¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶1_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1_________11¶¶¶1_1¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶1_1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_1¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶
          ¶¶¶¶¶¶¶¶¶1___¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_1¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶
          ¶¶¶¶¶¶¶1__11_1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1_1¶¶¶11111______1¶¶¶
          ¶¶¶¶1___1¶¶¶11¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1__________111¶¶_1¶¶¶
          ¶¶1__1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1_¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1_111¶¶¶¶¶¶¶¶¶¶1__¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__1____________1¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1_1¶¶¶¶¶¶111¶¶__¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶11___1¶¶¶¶¶¶1_1¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1__________1¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶11¶¶¶¶¶¶¶¶¶¶¶1___1¶¶¶¶¶111¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶1___11¶¶¶¶¶1____1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶1___11_________1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶1__1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶1¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
          ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶


  1. mwambanatanga
    13.01.2017 17:06

    Никто не упомянул утилиту faketime?


  1. leremin
    13.01.2017 20:01
    +1

    Я как-то массивы данных с некоего изделия в виде неприличного слова «нарисовал». Начальник отдела не оценил шутку.


    1. MaximAL
      14.01.2017 12:22

      Я бы оценил :-)


  1. agrrh
    14.01.2017 01:24
    +2

    А GitHub не забанит?


    Я не удержался и повторил на свой лад:
    https://github.com/weekend-software/gerpy


    1. Mingun
      14.01.2017 09:46
      +1

      Простите, а за что он должен забанить? Не думаете же вы, что каждый проект на GitHub'е должен начинаться именно на нём. Может хранилище существовало уже год, а автор только сегодня решил его импортировать? Git — это же распределённая система контроля версий, в ней нет главного хранилища, они все равноправны.


  1. stefan_iljic
    14.01.2017 12:24
    +2

    Еще такое есть: https://github.com/gelstudios/gitfiti


  1. bohdan4ik
    17.01.2017 00:47
    +4

    > Используется существующее на данный момент (преднамеренное?)
    > поведение Гитхаба при построении графика активности, учитывающее
    > предоставленные клиентом локальные даты коммитов.

    Преднамеренное, поскольку дата коммита подписывается, собственно, при коммите. Если бы сервис исправлял даты коммитов — вряд ли он набрал такую популярность, поскольку его задача — доступ к исходникам, а не контроль за тем, когда разработчик будет делать commit/push.


    1. MaximAL
      19.01.2017 12:09

      Логично, да.