2014-04-04 3 views
0

저는 GitLab에서 웹 훅을 통해 전개하기 위해 PHP로 클래스를 작성하고 있습니다.재귀 적으로 .git 디렉토리를 Docroot에서 찾으십시오.

분명히 후크 할 파일은 웹에서 사용할 수 있어야하며 docroot 내에 존재해야합니다.

하지만이 기능을 사용하려면 repro를 올바르게 가져 오려면 docroot에서 위쪽으로 돌아가서 .git 디렉토리가있는 디렉토리를 찾아야합니다.

위로 반복하는 반복기를 찾을 수 없습니다.

나는

Recursive Directory Iterator을 시도했다하지만 최상위 디렉토리에서 아래로 재귀 내가 .git 디렉토리를 포함 할 수있는 몇 가지 디렉토리가있을 수 있기 때문에 문제가 해결되지 않습니다.

.git 디렉토리의 첫 번째 인스턴스가 발견 될 때까지 위쪽으로 재귀를 수행하는 방법은 무엇입니까?

+2

위쪽으로 이동할 때 재귀가 필요하지 않으므로 아래쪽으로 이동하기가 쉽습니다. 왜 간단한 루프를 사용하지 않습니까? (.git은 현재 디렉토리에 없습니다.) – Izkata

+0

glob()은 무엇을 사용합니까? 배열에 없으면 하나의 디렉토리를 이동합니까? –

+0

'glob()'도 아래쪽으로 검색/일치시키는 것입니다. 너 해봤 어? – Izkata

답변

0

좋아,이 트릭을 할 것으로 보인다 거기에 더 쉬운 방법이있을 수 있지만 이것은 꽤 깨끗하게 목적을 제공합니다.

private function __seek() { 
    $directories = array(); 
    $dirs  = explode('/', dirname(__FILE__)); 

    // remove empty first item 
    array_shift($dirs); 

    // remove the top/home directory as we won't be able to read it anyway 
    $count = (count($dirs) - 1); 

    for ($i = 0; $i < $count; $i++): 
     $directories[] = '/' . implode('/', $dirs); 
     array_pop($dirs); 
    endfor; 

    $paths = array(); 

    foreach ($directories as $directory): 
     if (in_array('.git', scandir($directory))): 
      $paths['parent'] = dirname($directory); 
      $paths['directory'] = basename($directory); 
     endif; 
    endforeach; 

    return $paths; 
} 

이 내가 끌어에 chdir() 필요 나에게 디렉토리 (부모) 모두를 제공합니다 내가 할 수있는 멋진 배열을 반환하고, 디렉토리 이름 (디렉토리)로 끌어

Array 
(
    [parent] => /home/solution 
    [directory] => app 
) 
0

바보 나 ...

사실로 밝혀 졌 듯이 GIT는 직관적으로 당신을 검색합니다.

나는 5 개의 디렉토리에서 끌어 내려고 시도했지만 완벽하게 작동했습니다.

.git 디렉토리 아래의 모든 디렉토리에서 가져올 수 있습니다.

GIT FTW!

관련 문제