{"id":200946,"date":"2013-11-06T11:57:03","date_gmt":"2013-11-06T07:57:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=200946"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=200946","title":{"rendered":"<span class=\"post_title\">GitPHP \u0432 Badoo<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \tBadoo \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u043c git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0438 \u0432\u0435\u0442\u043e\u043a \u0438 \u0442\u0435\u0433\u043e\u0432. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 GitPHP (<a href=\"http:\/\/gitphp.org\">http:\/\/gitphp.org<\/a>) \u0432\u0435\u0440\u0441\u0438\u0438 0.2.4, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0435\u043a (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u043d\u0430\u0448\u0438\u043c workflow \u0432 JIRA, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0435\u0432\u044c\u044e \u0438 \u0442.\u0434.). \u0412 \u0446\u0435\u043b\u043e\u043c \u043d\u0430\u0441 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 20 \u0441\u0435\u043a\u0443\u043d\u0434. \u0418 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c GitPHP \u0438 \u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c, \u0440\u0435\u0448\u0430\u044f \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u0420\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432<\/h4>\n<p>  \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 badoo.com \u0432 \u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u0441\u043a\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u0443\u044e debug-\u043f\u0430\u043d\u0435\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043b\u0438 \u0435\u0435 \u0432 GitPHP \u0438 \u0441\u0442\u0430\u043b\u0438 \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u043a\u043e\u0434\u0430, \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0435\u0440\u044b. \u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u0448\u0430 debug-\u043f\u0430\u043d\u0435\u043b\u044c:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/467\/877\/439\/4678774393e550ee0d2eadd5df17eae7.png\"\/><\/p>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 (\u0438\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f), \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043d\u0430\u0447\u0430\u043b\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 trace. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 \u0432\u0440\u0435\u043c\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445).<\/p>\n<p>  \u0412\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u0438\u0445 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432:<\/p>\n<pre><code>&lt;?php class GitPHP_Log { \/\/ ...     public function timerStart() {         array_push($this-&gt;timers, microtime(true));     }      public function timerStop($name, $value = null) {         $timer = array_pop($this-&gt;timers);         $duration = microtime(true) - $timer;         \/\/ \u0412\u044b\u0447\u0442\u0435\u043c \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0437 \u0432\u0441\u0435\u0445 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u0442\u0430\u0439\u043c\u0435\u0440         foreach ($this-&gt;timers as &$item) $item += $duration;         $this-&gt;Log($name, $value, $duration);     } \/\/ ... } <\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e API \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>timerStart()<\/code>, \u0432 \u043a\u043e\u043d\u0446\u0435 \u2014 <code>timerStop()<\/code> \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<pre><code>&lt;?php $Log = new GitPHP_Log; $Log-&gt;timerStart();  $result = 0; $mult = 4; for ($i = 1; $i &lt; 1000000; $i+=2) {     $result += $mult \/ $i;     $mult = -$mult; }  $Log-&gt;timerStop(&quot;PI computation&quot;, $result); <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438, \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043b\u0430\u0441\u0441 \u0443\u0447\u0442\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043b\u0435\u0433\u043a\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043a\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 Smarty \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u00ab\u0430\u0432\u0442\u043e\u0442\u0430\u0439\u043c\u0435\u0440\u044b\u00bb. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043b\u0435\u0433\u043a\u043e \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0445\u043e\u0434\u0430 (\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442, \u0433\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f return):<\/p>\n<pre><code>&lt;?php class GitPHP_DebugAutoLog {         private $name;         public function __construct($name) {                 $this-&gt;name = $name;                 GitPHP_Log::GetInstance()-&gt;timerStart();         }          public function __destruct() {                 GitPHP_Log::GetInstance()-&gt;timerStop($this-&gt;name);         } } <\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>$Log = new GitPHP_DebugAutoLog(\u2018timer_name\u2019); <\/code> \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043b\u044e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434\u0430, \u0438 \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>&lt;?php function doSomething($a) {     $Log = GitPHP_DebugAutoLog('doSomething');     if ($a &gt; 5) {         echo &quot;Hello world!\\n&quot;;         sleep(5);         return;     }     sleep(1); } <\/code><\/pre>\n<p>  <\/p>\n<h4>\u0422\u044b\u0441\u044f\u0447\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 git cat-file -t &lt;commit&gt;<\/h4>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0442\u0430\u0439\u043c\u0435\u0440\u0430\u043c \u043c\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0439\u0442\u0438, \u0433\u0434\u0435 GitPHP \u0432\u0435\u0440\u0441\u0438\u0438 0.2.4 \u0442\u0440\u0430\u0442\u0438\u043b \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0433 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 <code>git cat-file -t <\/code>\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0442\u0438\u043f \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043c\u0438\u0442 \u00ab\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u043c \u0442\u0435\u0433\u043e\u043c\u00bb (<a href=\"http:\/\/git-scm.com\/book\/en\/Git-Basics-Tagging#Lightweight-Tags\">http:\/\/git-scm.com\/book\/en\/Git-Basics-Tagging#Lightweight-Tags<\/a>). \u041b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0435 \u0442\u0435\u0433\u0438 \u0432 Git \u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0442\u0435\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b \u0442\u0435\u0433\u043e\u0432 \u043d\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0440\u0430\u043b\u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0438 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b\u0438 \u043f\u0430\u0440\u0443 \u0442\u044b\u0441\u044f\u0447 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>git cat-file -t,<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0432\u0448\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 20 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>  \u041a\u0430\u043a \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e GitPHP \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0433\u0430 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u043d \u00ab\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u043c\u00bb? \u0412\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>  \u041d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 GitPHP \u0440\u044f\u0434\u043e\u043c \u0441 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u0435\u0442\u043a\u0438 \u0438 \u0442\u0435\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/7a9\/a89\/ea4\/7a9a89ea4e47536d608ad436041c75f2.png\"\/><\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>GitPHP_TagList<\/code> \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0435\u0433\u043e\u0432, \u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442:<\/p>\n<pre><code>&lt;?php class GitPHP_TagList extends GitPHP_RefList { \/\/ ...         public function GetCommitTags($commit) {                 if (!$commit) return array();                 $commitHash = $commit-&gt;GetHash();                 if (!$this-&gt;dataLoaded) $this-&gt;LoadData();                 $tags = array();                 foreach ($this-&gt;refs as $tag =&gt; $hash) {                         if (isset($this-&gt;commits[$tag])) {                                 \/\/ ...                         } else {                                 $tagObj = $this-&gt;project-&gt;GetObjectManager()-&gt;GetTag($tag, $hash);                                 $tagCommitHash = $tagObj-&gt;GetCommitHash();                                 \/\/ ...                                 if ($tagCommitHash == $commitHash) {                                         $tags[] = $tagObj;                                 }                         }                 }                 return $tags;         } \/\/ ... } <\/code><\/pre>\n<p>  \u0422.\u0435. \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0433\u043e\u0432, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ol>\n<li>\u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0442\u0435\u0433\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 (\u0432\u044b\u0437\u043e\u0432 LoadData()).<\/li>\n<li>\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0442\u0435\u0433\u043e\u0432.<\/li>\n<li>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0433\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442.<\/li>\n<li>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f GetCommitHash() \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0435\u0433\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u0441\u043a\u043e\u043c\u044b\u043c.<\/li>\n<\/ol>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0432\u0438\u0434\u0430 <code>array( commit_hash =&gt; array(tags) )<\/code>, \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <code>GetCommitHash()<\/code>: \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>Load($tag)<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b Git \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code>&lt;?php class GitPHP_TagLoad_Git implements GitPHP_TagLoadStrategy_Interface { \/\/ ...         public function Load($tag) { \/\/ ...                 $args[] = '-t';                 $args[] = $tag-&gt;GetHash();                 $ret = trim($this-&gt;exe-&gt;Execute($tag-&gt;GetProject()-&gt;GetPath(), GIT_CAT_FILE, $args));                                  if ($ret === 'commit') { \/\/ ...                         return array(\/* ... *\/);                 } \/\/ ...                 $ret = $this-&gt;exe-&gt;Execute($tag-&gt;GetProject()-&gt;GetPath(), GIT_CAT_FILE, $args); \/\/ ...                 return array(\/* ... *\/);         } } <\/code><\/pre>\n<p>  \u0422.\u0435. \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0432\u0435\u0442\u043a\u0438 \u0438 \u0442\u0435\u0433\u0438 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043a\u043e\u043c\u043c\u0438\u0442, GitPHP \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0442\u0435\u0433\u043e\u0432 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 git cat-file -t \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445. \u041d\u0435\u043f\u043b\u043e\u0445\u043e, \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0435\u0440, \u0442\u0430\u043a \u0434\u0435\u0440\u0436\u0430\u0442\u044c!<\/p>\n<h4>\u0421\u043e\u0442\u043d\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 git rev-list &#8212;max-count=1 \u2026 &lt;commit&gt;<\/h4>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0435. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u0442\u0443, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u0430\u0432\u0442\u043e\u0440\u0430 \u0438 \u0442.\u0434, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0441\u044f git rev-list &#8212;max-count=1 \u2026 &lt;commit&gt;. \u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u043e\u0436\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439:<\/p>\n<pre><code>&lt;?php class GitPHP_CommitLoad_Git extends GitPHP_CommitLoad_Base {         public function Load($commit) { \/\/ ...                 \/* get data from git_rev_list *\/                 $args = array();                 $args[] = '--header';                 $args[] = '--parents';                 $args[] = '--max-count=1';                 $args[] = '--abbrev-commit';                 $args[] = $commit-&gt;GetHash();                 $ret = $this-&gt;exe-&gt;Execute($commit-&gt;GetProject()-&gt;GetPath(), GIT_REV_LIST, $args); \/\/ ...                 return array( \/\/ ...                 );         } \/\/ ... } <\/code><\/pre>\n<p>  <\/p>\n<h4>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u043f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 (git cat-file &#8212;batch)<\/h4>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a git cat-file, Git \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u043f\u0446\u0438\u0438 &#8212;batch. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0432 stdin, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 stdout. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b \u0432\u0441\u0435 \u0445\u044d\u0448\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <code>git cat-file --batch <\/code> \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 (\u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0438 GitPHP 0.2.4 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 *nix):<\/p>\n<pre><code>&lt;?php class GitPHP_Project { \/\/ ...     public function BatchReadData(array $hashes) {         if (!count($hashes)) return array();         $outfile = tempnam('\/tmp', 'objlist');         $hashlistfile = tempnam('\/tmp', 'objlist');         file_put_contents($hashlistfile, implode(&quot;\\n&quot;, $hashes));         $Git = new GitPHP_GitExe($this);         $Git-&gt;Execute(GIT_CAT_FILE, array('--batch', ' &lt; ' . escapeshellarg($hashlistfile), ' &gt; ' . escapeshellarg($outfile)));         unlink($hashlistfile);         $fp = fopen($outfile, 'r');         unlink($outfile);          $types = $contents = array();         while (!feof($fp)) {             $ln = rtrim(fgets($fp));             if (!$ln) continue;             list($hash, $type, $n) = explode(&quot; &quot;, rtrim($ln));             $contents[$hash] = fread($fp, $n);             $types[$hash] = $type;         }          return array('contents' =&gt; $contents, 'types' =&gt; $types);     } \/\/ ... } <\/code><\/pre>\n<p>  \u041c\u044b \u0441\u0442\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0433\u0434\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430\u0445 (\u0442.\u0435. \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0445 \u0432\u0441\u0435 \u043e\u0434\u043d\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>git cat-file --batch<\/code>). \u0422\u0430\u043a\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0430 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 20 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e 0,5 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b GitPHP \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<h4>Open-source: \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 GitPHP 0.2.9 (master)<\/h4>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0432, \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<code> git cat-file --batch<\/code>. \u0425\u043e\u0442\u044c \u044d\u0442\u043e \u0438 \u043d\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u044d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u0437\u0430 \u0440\u0430\u0437, \u043d\u0435 \u0442\u0435\u0440\u044f\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438! \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0431\u0435\u0437 \u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044c <code>git cat-file --batch<\/code> \u0447\u0435\u0440\u0435\u0437 <code>proc_open()<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b!<\/p>\n<p>  \u0412\u043e\u0442 \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0443\u0431\u0440\u0430\u043d\u0430):<\/p>\n<pre><code>&lt;?php \/\/ ... class GitPHP_GitExe implements GitPHP_Observable_Interface { \/\/ ...         public function GetObjectData($projectPath, $hash) {                 $process = $this-&gt;GetProcess($projectPath);                 $pipes = $process['pipes'];                 $data = $hash . &quot;\\n&quot;;                 fwrite($pipes[0], $data);                 fflush($pipes[0]);                  $ln = rtrim(fgets($pipes[1]));                 $parts = explode(&quot; &quot;, rtrim($ln));                 list($hash, $type, $n) = $parts;                 $contents = '';                 while (strlen($contents) &lt; $n) {                         $buf = fread($pipes[1], min(4096, $n - strlen($contents)));                         $contents .= $buf;                 }                  return array(                         'contents' =&gt; $contents,                         'type' =&gt; $type,                 );         } \/\/ ... } <\/code><\/pre>\n<p>  \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u0435 \u0434\u0435\u043b\u0430\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u044b git, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b <code>git cat-file<\/code> \u0438 <code>git rev-list<\/code> \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 \u043d\u0430\u0448\u0435\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  \u041c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u0438\u043d \u043a\u043e\u043c\u043c\u0438\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 pull-request \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 GitPHP. \u0427\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0442\u0447 \u043f\u0440\u0438\u043d\u044f\u043b\u0438! \u0412\u043e\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043c\u0438\u0442:<\/p>\n<p>  <a href=\"http:\/\/source.gitphp.org\/projects\/gitphp.git\/commitdiff\/3c87676b3afe4b0c1a1f7198995cecc176200482\">source.gitphp.org\/projects\/gitphp.git\/commitdiff\/3c87676b3afe4b0c1a1f7198995cecc176200482<\/a><\/p>\n<p>  \u0410\u0432\u0442\u043e\u0440\u043e\u043c \u0431\u044b\u043b\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434 (\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0430\u043c\u0438), \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u0432\u0435\u0442\u043a\u0435 master \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f GitPHP! \u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u00ab\u0440\u0435\u0436\u0438\u043c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>$compat = false;<\/code> \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u042e\u0440\u0438\u0439 <a href=\"http:\/\/habrahabr.ru\/users\/yourock\/\" class=\"user_link\">youROCK<\/a> \u041d\u0430\u0441\u0440\u0435\u0442\u0434\u0438\u043d\u043e\u0432, PHP-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, Badoo<br \/>  \u0415\u0432\u0433\u0435\u043d\u0438\u0439 <a href=\"http:\/\/habrahabr.ru\/users\/ezh\/\" class=\"user_link\">eZH<\/a> \u041c\u0430\u0445\u0440\u043e\u0432, QA-\u0438\u043d\u0436\u0435\u043d\u0435\u0440, Badoo    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/company\/badoo\/blog\/200946\/\"> http:\/\/habrahabr.ru\/company\/badoo\/blog\/200946\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \tBadoo \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u043c git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0438 \u0432\u0435\u0442\u043e\u043a \u0438 \u0442\u0435\u0433\u043e\u0432. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 GitPHP (<a href=\"http:\/\/gitphp.org\">http:\/\/gitphp.org<\/a>) \u0432\u0435\u0440\u0441\u0438\u0438 0.2.4, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0435\u043a (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u043d\u0430\u0448\u0438\u043c workflow \u0432 JIRA, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0435\u0432\u044c\u044e \u0438 \u0442.\u0434.). \u0412 \u0446\u0435\u043b\u043e\u043c \u043d\u0430\u0441 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 20 \u0441\u0435\u043a\u0443\u043d\u0434. \u0418 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c GitPHP \u0438 \u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c, \u0440\u0435\u0448\u0430\u044f \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-200946","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/200946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=200946"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/200946\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=200946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=200946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=200946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}