Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I view all the git repositories on my machine?

Tags:

git

People also ask

How do I see all of my git repository?

If you are in Linux find / -name ". git" , otherwise there is no way, they are standard directories, just use your OS file/folder find program to find .

How do I find my local git repository?

The default location that Git Bash starts in is typically the home directory (~) or /c/users/<Windows-user-account>/ on Windows OS. To determine the current directory, type pwd at the $ prompt. Change directory (cd) into the folder that you created for hosting the repository locally.


If you are in Linux find / -name ".git", otherwise there is no way, they are standard directories, just use your OS file/folder find program to find .git named folders.


ORIGINAL ANSWER: This works pretty well from Windows Powershell:

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

EDIT #1: -Filter is twice as fast as -Include. Here is that solution:

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

EDIT #2: Keith E. Truesdell mentioned sending the output to a file. See his comment for that solution. I prefer console output. But his comment got me thinking that I prefer just the full path, not the whole mess that is returned by default. If you want that just the full path, use the following:

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

FINAL NOTE: The above solutions only return Git repositories under the current directory. If you want ALL repositories on a drive, you should run the command once from the root of each drive.


On *nix, this will also find any --bare repositories.

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

Git repositories all have HEAD, refs and objects entries.

on GNU/anything,

find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n

Just checking for .git will miss many bare repos and submodules.

To go full-paranoid on the checking you can ask git to do all its own checks before printing,

find -name HEAD -execdir test -e refs -a -e objects \; \
      -execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;

(edit: I thought the .git/config file was necessary, turns out it's not, so the absolute minimum git init newrepo is

mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD

)


On Linux, a faster way would be:

locate -r "\.git$"

assuming you keep locate's database updated with sudo updatedb


On Linux and OS X the following command is possibly the fastest (ignoring repositories without .git) when the root directory of find is /:

find / -name .git -exec dirname {} \; -prune

But for roots that have mostly repositories underneath, the following is probably the fastest (you may want to replace / with . or another root):

find / -type d -exec test -d {}/.git \; -prune -print

Quick explanation of the primaries of find used (since no operators are present here, -and is implicit, i.e., for each visited node primaries are evaluated left to right until one of them evaluates to false):

  • -name is true if the name matches (often, but not here, with wildcards)
  • -exec executes a command terminated by ; (which is escaped by \ to avoid interpretation by the shell), and is true if the return status is 0 (i.e., OK). The current node is available as {} (which needs no escaping)
  • -prune is always true, and causes all child nodes to be skipped
  • -type d is true for directories
  • -print is needed here because if -exec is present it is not implicitly appended