내 컴퓨터에있는 모든 git 저장소를 볼 수있는 방법이 있습니까? 그것에 대한 명령이 있습니까?
내 컴퓨터에있는 모든 git 저장소를 볼 수있는 방법이 있습니까? 그것에 대한 명령이 있습니까?
답변:
당신이 리눅스에 있다면 find / -name ".git", 그렇지 않으면 방법이 없습니다. 그들은 표준 디렉토리입니다. OS 파일 / 폴더 찾기 프로그램을 사용하여 .git명명 된 폴더 를 찾으십시오 .
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
원래 답변 : 이것은 Windows Powershell에서 매우 잘 작동합니다.
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse
편집 # 1 : -Filter는 -Include 보다 두 배 빠릅니다 . 그 해결책은 다음과 같습니다.
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse
편집 # 2 : Keith E. Truesdell 이 출력을 파일로 보내는 것을 언급했습니다. 해당 솔루션에 대한 그의 의견을 참조하십시오. 콘솔 출력을 선호합니다. 그러나 그의 의견은 기본적으로 반환되는 전체 경로가 아닌 전체 경로를 선호한다고 생각했습니다. 전체 경로 만 원하면 다음을 사용하십시오.
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }
최종 참고 : 위의 솔루션 은 현재 디렉토리 아래의 Git 저장소 만 반환합니다 . 드라이브의 모든 저장소를 원하면 각 드라이브의 루트에서 명령을 한 번 실행해야합니다.
* nix에서는 모든 --bare리포지토리 도 찾습니다 .
find / -name "*.git" -type d
name.git가 없습니다. 예를 들어 제가 따르지 않는 규칙 일뿐입니다.
find있습니까?
Git 저장소에는 모두 HEAD, refs및 objects항목이 있습니다.
GNU / anything에서
find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n
확인하는 것만으로도 .git많은 베어 리포지토리와 하위 모듈이 누락됩니다.
검사에 대한 완전한 편집증을 얻으려면 git에게 인쇄하기 전에 모든 검사를 수행하도록 요청할 수 있습니다.
find -name HEAD -execdir test -e refs -a -e objects \; \
-execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;
(편집 : .git/config파일이 필요 하다고 생각했지만 그렇지 않은 것으로 밝혀 졌으므로 절대 최소값 git init newrepo은
mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD
)
Linux에서 더 빠른 방법은 다음과 같습니다.
locate -r "\.git$"
로 케이트의 데이터베이스를 계속 업데이트한다고 가정합니다. sudo updatedb
Linux 및 OS X에서 .git의 루트 디렉토리 find가 /다음 과 같을 때 다음 명령이 가장 빠를 수 있습니다 (가없는 저장소 무시 ) .
find / -name .git -exec dirname {} \; -prune
그러나 아래 대부분의 저장소가 뿌리를 들어, 다음은 아마도 가장 빠른 (교체 할 수 있습니다 /으로 .또는 다른 루트) :
find / -type d -exec test -d {}/.git \; -prune -print
사용 된 기본 항목 에 대한 빠른 설명 find( 여기 에는 연산자 가 없기 때문에 -and암시 적입니다. 즉, 방문한 각 노드 기본 항목 중 하나가로 평가 될 때까지 왼쪽에서 오른쪽으로 평가됨 false) :
-name인 true이름 (와일드 카드로, 여기에 자주는 아니지만)과 일치하는 경우-exec로 끝나는 명령을 실행하고 ;( \쉘의 해석을 피하기 위해 이스케이프 됨 ) true반환 상태가 0(즉, OK) 인 경우입니다. 현재 노드는 다음과 같이 사용할 수 있습니다 {}(이스케이프가 필요하지 않음).-prune항상 true이며 모든 하위 노드를 건너 뜁니다.-type d인 true디렉토리에 대해-print-exec존재하는 경우 암시 적으로 추가되지 않기 때문에 여기에 필요합니다.Linux에서는 루트 권한으로 다음 명령을 시도하십시오.
find / | grep \\.git$
이것은 .git로 끝나는 모든 파일을 검색합니다 .Windows, Linux 등의 검색 도구를 사용하여 수행 할 수 있습니다.
find다음으로 필터링 출력 다 grep. 차라리 사용합니다--name "*.git"
/트리를 grep으로 전송하도록합니다. 첫 번째 프로세스 는 모든 것을 수행하고 쓸모없는 IO 사용을 피할 수 있습니다. 일반적으로 사용자에게는 실제 차이가 아니지만 큰 파일 시스템의 경우 차이를 만들 수 있습니다.
간단한 PowerShell 버전 :
Get-ChildItem . -Recurse -Hidden .git
C:\users\<username>\PrintHood 또한, 파일에 출력을 추가하는 것이 유용하다는 것을 알았고 경로 / 디렉토리 정보 만 필터링하기 위해 경로 (이 스크립트가 많은 정보를 얻었으므로)에만 신경을 썼기 때문에 Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Eric Burcham의 답변과 약간의 차이가 있습니다. 그 대답은 끝에 \ .git을 추가하지만 이것은 그렇지 않습니다.
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }
나는 하루를 시작할 때이 명령을 사용합니다. 단순히 위의 몇 가지 git 명령을 추가합니다. 어떤 이유로 든 우리의 git 저장소는 가져 오기를 실행 한 다음 가져 오는 경우 가장 잘 작동하지만 이유를 모릅니다. 그리고 어떤 이유로 든 많은 하위 모듈이 있습니다. 어쨌든 {} 사이에 필요한 것을 넣으십시오.
push-location; Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { cd $_.parent.fullname; write-host '*************'; $(get-location).path; git fetch; git pull; git checkout .; git clean -f; git submodule update; git status; write-host '*************'; write-host ' '; }; pop-location