Чи є спосіб я бачити всі сховища 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
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 у поточному каталозі . Якщо ви хочете ВСІХ сховищах на диску, вам слід виконати команду один раз з кореня кожного диска.
У * 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$"
припускаючи, що ви постійно оновлюєте базу даних locate 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"
/дерево, а друге загрібати, коли перший може зробити все і уникнути величезного марного використання IO. Це не є реальною різницею для користувача, але для великих файлових систем це може змінити значення.
Проста версія 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