Як я можу переглянути всі сховища git на своїй машині?


121

Чи є спосіб я бачити всі сховища git, які існують на моїй машині? Будь-яка команда для цього?


2
Див. Git-підсумок . Це bash-скрипт, який обидва перераховує всі сховища та виводить їх інформацію про стан. Заперечення, я один із дияволів.
cagliari2005

@ cagliari2005: Що з голими сховищами? stackoverflow.com/questions/60064170/…
Лучано

Відповіді:


102

Якщо ви перебуваєте в Linux find / -name ".git", інакше немає можливості, вони є стандартними каталогами, просто використовуйте програму пошуку файлів / папок ОС, щоб знайти .gitпапки з назвами.


1
У Windows (і я впевнений, що і на Mac) ви могли б зробити щось подібне ... просто пошук каталогів під назвою .git - що саме git використовує для зберігання своєї мета інформації.
cjstehno

3
Для Macs також працює вищевказана команда. (Якщо ви не працюєте з ОС9 або раніше!)
Олексій Фейнман

1
Будь-які хороші сценарії оболонки або невеликі утилітні програми, які реалізують цю просту функцію пошуку файлів і додають інформацію про стан сховища до списку? Це не повинно бути проблемою для написання сценарію оболонки, а скоріше використовувати добре прийняті сценарії, ніж мої власні неоптимізовані хаки.
jmlane

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

знайти сторінку людини має рішення. Подібно до прийнятої відповіді, але використовуючи -prune, щоб повернутися швидше, не потрапляючи в каталоги .git. Без чорносливу пошук потрапить у папку .git і залежно від вмісту витрачати час на пошук всередині без потреби. Рішення чоловічої сторінки слід "знайти repo / (-exec test -d '{}' /. Svn \; -or \ -exec test -d {} /. Git \; -or -exec test -d {} / CVS \ ;) \ -print -prune Перевірте це. Відредагуйте svn та cvs, якщо не потрібно
silent_penguin

38

ОРИГІНАЛЬНИЙ ВІДПОВІДЬ : Це дуже добре працює від Windows Powershell:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse

EDIT №1 : -Фільтр вдвічі швидший, ніж -Включити. Ось таке рішення:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse

EDIT № 2 : Кіт Е. Труесделл згадував надсилання виводу у файл. Дивіться його коментар до цього рішення. Я віддаю перевагу консольному виходу. Але його коментар змусив мене подумати, що я віддаю перевагу саме повному шляху, а не цілому безладу, який повертається за замовчуванням. Якщо ви хочете просто повний шлях, використовуйте наступне:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }

ЗАКЛЮЧНА ПРИМІТКА : Вищезазначені рішення повертають лише сховища Git у поточному каталозі . Якщо ви хочете ВСІХ сховищах на диску, вам слід виконати команду один раз з кореня кожного диска.


1
дуже корисно для користувачів Windows! :)
Фелікс Фелісіант

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 мій бути швидшим у нових версіях PowerShell. Я піду час. EDIT - Додавання "-Directory" не суттєво відрізняється, як свідчить документація. Однак додавання атрибутів каталогу, як ви пропонуєте, робить це повільніше. Тепер я маю ідею, чому, але я перевірив його обома способами за допомогою Measure-Command, і всі три з додатковим атрибутом Directory були повільнішими, ніж усі без них.
bopapa_1979

18

У * nix це також знайде будь-які --bareсховища.

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

3
Голі сховища не потрібно називати name.gitце лише умовою, якої я, наприклад, не дотримуюсь.
Аркаїц Хіменез

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

)



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
@Gregory Pakosz: Яка різниця?
Мішель Гокан

11
@Michel, ви запускаєте два процеси і змушуєте перший передавати по трубі все /дерево, а друге загрібати, коли перший може зробити все і уникнути величезного марного використання IO. Це не є реальною різницею для користувача, але для великих файлових систем це може змінити значення.
Аркаіц Хіменез

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.