Есть ли способ увидеть все репозитории git, существующие на моем компьютере? Любая команда для этого?
Есть ли способ увидеть все репозитории git, существующие на моем компьютере? Любая команда для этого?
Ответы:
Если вы работаете в Linux find / -name ".git", иначе нет возможности, это стандартные каталоги, просто используйте программу поиска файлов / папок в вашей ОС, чтобы найти .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 : -Фильтр в два раза быстрее, чем -Include. Вот это решение:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse
РЕДАКТИРОВАТЬ № 2 : Кейт Э. Трусделл упомянул отправку вывода в файл. См. Его комментарий для этого решения. Я предпочитаю вывод в консоль. Но его комментарий заставил меня подумать, что я предпочитаю только полный путь, а не весь беспорядок, который возвращается по умолчанию. Если вам нужен только полный путь, используйте следующее:
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 / что угодно,
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(т. е. ОК). Текущий узел доступен как{} (что не требует экранирования)-pruneвсегда true, и заставляет все дочерние узлы пропускаться-type dэто trueдля каталогов-printздесь нужен, потому что, если -execон присутствует, он не добавляется неявноВ Linux попробуйте эту команду с правами root:
find / | grep \\.git$
это просто ищет все файлы, которые заканчиваются на .git ... вы можете сделать это с помощью инструментов поиска в Windows, Linux и т. д.
findвыводить все, а затем фильтровать с помощью grep. Я бы предпочел--name "*.git"
/дерево, а второй - в grep, тогда как первый может делать все и избегать огромного бесполезного использования ввода-вывода. Обычно это не является реальной разницей для пользователя, но для больших файловых систем это может иметь значение.
Простая версия PowerShell:
Get-ChildItem . -Recurse -Hidden .git
C:\users\<username>\PrintHood Кроме того, я счел полезным добавить вывод в файл, и, поскольку я заботился только о пути (поскольку этот сценарий получает кучу информации), нужно также фильтровать только информацию о пути / каталоге. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Небольшое отклонение от ответа Эрика Бурчема. Этот ответ добавляет \ .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