Как я могу просмотреть все репозитории git на моем компьютере?


121

Есть ли способ увидеть все репозитории git, существующие на моем компьютере? Любая команда для этого?


2
См. Git-summary . Это сценарий bash, который перечисляет все репозитории и выводит информацию об их состоянии. Отказ от ответственности, я один из разработчиков.
cagliari2005

@ cagliari2005: А как насчет голых репозиториев? stackoverflow.com/questions/60064170/…
Лучано

Ответы:


102

Если вы работаете в Linux find / -name ".git", иначе нет возможности, это стандартные каталоги, просто используйте программу поиска файлов / папок в вашей ОС, чтобы найти .gitуказанные папки.


1
В Windows (и я уверен, что Mac тоже) вы могли бы сделать что-то подобное ... просто поиск каталогов с именем .git - это то, что git использует для хранения своей метаинформации.
cjstehno 07

3
На Mac указанная выше команда тоже работает. (Если вы не используете OS9 или более раннюю версию!)
Алекс Фейнман,

1
Есть ли хорошие сценарии оболочки или небольшие служебные приложения, которые реализуют эту простую функцию поиска файлов и добавляют информацию о статусе репозитория в список? Не должно быть проблем с написанием сценария оболочки для этого, лучше используйте хорошо адаптированные сценарии, чем мои собственные неоптимизированные хаки.
jmlane

6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken

найти на странице руководства есть решение. Аналогично принятому ответу, но с использованием -prune для более быстрого возврата, не заходя в каталоги .git. Без prune find будет попадать в папку .git и, в зависимости от содержимого, тратить время на поиск внутри без необходимости. Решение для страницы руководства следует "найти репо / (-exec test -d '{}' /. Svn \; -or \ -exec test -d {} /. Git \; -or -exec test -d {} / CVS \ ;) \ -print -prune Проверьте это. Отредактируйте svn и cvs, если не требуется
quiet_penguin

38

ОРИГИНАЛЬНЫЙ ОТВЕТ : Это очень хорошо работает в 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 только в текущем каталоге . Если вам нужны ВСЕ репозитории на диске, вы должны запустить команду один раз из корня каждого диска.


1
очень полезно для пользователей Windows! :)
Felix Feliciant

2
Get-ChildItem: не найден параметр, соответствующий имени параметра «Атрибуты». На строке: 1 символ: 28
Девальд Свейнпол

@DewaldSwanepoel - Я понятия не имею, почему вы видите эту ошибку в параметре Attributes. Это явно указано в документации, и я попробовал это сейчас на нескольких комбинациях версий Windows / PowerShell. Все Windows 7, 8 и 10 работают с разными версиями PowerShell для меня. Если вы ДЕЙСТВИТЕЛЬНО узнаете, почему возникает ошибка, поделитесь ею здесь, чтобы мы могли узнать:>)
bopapa_1979

2
@DewaldSwanepoel - Вы ОБЯЗАТЕЛЬНО можете обновить свою версию PowerShell. Мы делаем это с шоколадным вкусом. В настоящее время я использую PowerShell версии 5.0 в Windows 7 на работе.
bopapa_1979

1
@ KeithE.Truesdell - Я почти уверен, что атрибуты "Directory + Hidden" включены и будут искать только каталоги. Добавление -Directory позволит ускорить работу в новых версиях PowerShell. Я пойду на время. РЕДАКТИРОВАТЬ - Добавление "-Directory" не имеет существенного значения, как указано в документации. Однако добавление атрибута каталога, как вы предлагаете, делает его медленнее. Теперь я понимаю, почему, но я протестировал оба способа с помощью Measure-Command, и все три с дополнительным атрибутом Directory были медленнее, чем все три без него.
bopapa_1979 05

18

В * nix это также найдет любые --bareрепозитории.

find / -name "*.git" -type d

3
Открытые репозитории не нужно называть, это name.gitпросто соглашение, которому я, например, не следую.
Arkaitz Jimenez 07

3
Учитывая, что чистые репозитории не должны следовать этому соглашению об именах, есть ли универсальный способ для findэтих репозиториев?
jmlane

11

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

)


4

В Linux более быстрый способ:

locate -r "\.git$"

предполагая, что вы постоянно обновляете базу данных местоположения с помощью sudo updatedb


Определенно, определение местоположения выполняется быстрее, используйте его с осторожностью, см. Здесь: unix.stackexchange.com/questions/60205/…
AjayKumarBasuthkar

3

В 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он присутствует, он не добавляется неявно

2

В Linux попробуйте эту команду с правами root:

find / | grep \\.git$

это просто ищет все файлы, которые заканчиваются на .git ... вы можете сделать это с помощью инструментов поиска в Windows, Linux и т. д.


7
Нет смысла позволять findвыводить все, а затем фильтровать с помощью grep. Я бы предпочел--name "*.git"
Грегори Пакош

2
@ Грегори Пакош: В чем разница?
Мишель Гокан

11
@Michel, вы запускаете 2 процесса и заставляете первый передавать по каналу все /дерево, а второй - в grep, тогда как первый может делать все и избегать огромного бесполезного использования ввода-вывода. Обычно это не является реальной разницей для пользователя, но для больших файловых систем это может иметь значение.
Arkaitz Jimenez 07

2
в любом случае, если вы хотите использовать команду JUST find, лучше использовать -regex вместо -name ... в этом случае используйте эту команду: sudo find / -regex '. * \. git'
Мишель Гокан,

4
@MichelKogan, почему лучше?
Марк Эймери

2

Простая версия PowerShell:

Get-ChildItem . -Recurse -Hidden .git

1
Это сработало для меня! Спасибо! Я получил некоторые ошибки для нескольких мест, к которым он пытался получить доступ, который работал как обычный пользователь, к которому сценарий PowerShell не имел доступа, но при дальнейшем просмотре это были места, о которых я не должен беспокоиться в любом случае (т.е. - C:\users\<username>\PrintHood Кроме того, я счел полезным добавить вывод в файл, и, поскольку я заботился только о пути (поскольку этот сценарий получает кучу информации), нужно также фильтровать только информацию о пути / каталоге. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Кейт Э.

1

Для Linux:

dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo 

1

Небольшое отклонение от ответа Эрика Бурчема. Этот ответ добавляет \ .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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.