Как составить список тегов Git и сообщений с помощью PHP?

#php #git

#php #git

Вопрос:

Я хотел бы перечислить последние 10 тегов с сообщениями git с использованием php. Следуйте моим примерам:

фиксируем что-то

 git commit -a -m 'hello world'
  

создание нового тега

 git tag -a v.1.0 -m 'this new feauture show hello world'
  

Теперь в моем приложении я просто хочу перечислить созданные теги, например:

 <html>
  <head>
    <title>Listing tags</title>
  </head>
  <body>
    <h1>Last Tags</h1>
    <ul>
      <!-- I'm just assuming a situation, but this doesn't work -->
        <?php $tags = system('git tag --list'); ?>        
        <?php foreach($tags as $tag> : ?>
          <li><?php echo $tag['tag_name']; ?> - <?php echo $tag['msg']; ?></li>
        <?php endforeach; ?>
    </ul>
  </body>
</html>
  

Комментарии:

1. В composer доступно несколько библиотек, которые предоставят вам хороший набор функций, которые вы можете использовать для работы с репозиториями Git в вашем PHP-коде. Попробуйте найти их в packagist .

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

Ответ №1:

  1. git tag --list не включает сообщения, используйте что-то вроде git tag -n вместо этого

  2. system() возвращает только последнюю строку вывода команды при успешном выполнении. Остальная часть выходных данных выводится напрямую.

    Если вы хотите, чтобы все строки были в виде массива, используйте 2-й аргумент exec() :

     exec('git tag -n', $tags);
      

Комментарии:

1. @ShiraNail7 на самом деле проблема заключалась в системной функции, вы сразу перешли к сути проблемы. Я перешел к документу php, чтобы увидеть эти различия, спасибо, чувак.

Ответ №2:

Вы можете использовать --format опцию для управления форматом выходных данных.

Например, следующий код извлекает имена тегов и темы фиксации, разделенные косой чертой.

 $cmd = "git tag --list --format='%(refname:strip=2)/%(contents:subject)'";

exec($cmd, $out, $exit_status);
if ($exit_status) {
    // command failed
}

foreach ($out as $line) {
    $pos = strpos($line, '/');
    $tag = substr($line, 0, $pos);
    $msg = substr($line, $pos   1);
    echo "$tag - $msgn";
}
  

Обратите внимание, %(refname:strip=2) удаляет refs/tags/ префикс из части после $GIT_DIR .

Комментарии:

1. Интересно @Ruslan Osmanov, я попробую, транки. О команде git для меня тихо, мои сомнения были в том, как использовать php для составления списка тегов.

2. Я попробовал то, что вы мне сказали, и все работает как по волшебству, кккккк. Самая большая проблема заключалась в том, что я использовал системную команду, которая сильно отличается от exec. Итак, я перешел к документу php, чтобы увидеть это. Еще раз, спасибо.