Làm cách nào để xem tất cả các kho lưu trữ git trên máy tính của tôi?


121

Có cách nào để tôi có thể xem tất cả các kho lưu trữ git tồn tại trên máy của mình không? Bất kỳ lệnh nào cho điều đó?


2
Xem git-tóm tắt . Nó là một tập lệnh bash mà cả hai đều liệt kê tất cả các kho lưu trữ và xuất ra thông tin trạng thái của chúng. Tuyên bố từ chối trách nhiệm, tôi là một trong những nhà phát triển.
cagliari2005

@ cagliari2005: Còn kho trống thì sao? stackoverflow.com/questions/60064170/…
Luciano

Câu trả lời:


102

Nếu bạn đang sử dụng Linux find / -name ".git", nếu không thì không có cách nào cả, chúng là thư mục tiêu chuẩn, chỉ cần sử dụng chương trình tìm tệp / thư mục hệ điều hành của bạn để tìm .gitcác thư mục được đặt tên.


1
Trên Windows (và tôi chắc chắn cả Mac nữa), bạn có thể làm điều gì đó tương tự ... chỉ là tìm kiếm các thư mục có tên .git - đó là những gì git sử dụng để lưu trữ thông tin meta của nó.
cjstehno

3
Trên máy Mac, lệnh trên cũng hoạt động. (Trừ khi bạn đang chạy OS9 hoặc sớm hơn!)
Alex Feinman

1
Bất kỳ tập lệnh shell tốt hoặc ứng dụng tiện ích nhỏ nào triển khai chức năng tìm kiếm tệp đơn giản này và thêm thông tin trạng thái kho lưu trữ vào danh sách? Không nên viết một kịch bản shell để làm như vậy, mà là sử dụng các tập lệnh được chấp nhận tốt hơn là các bản hack chưa được tối ưu hóa của riêng tôi.
jmlane

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

tìm trang người đàn ông có giải pháp. Tương tự như câu trả lời được chấp nhận nhưng sử dụng -prune để trả về nhanh hơn mà không cần vào thư mục .git. Nếu không có sơ lược tìm kiếm sẽ đi vào thư mục .git và tùy thuộc vào nội dung, dành thời gian tìm kiếm bên trong một cách không cần thiết. Giải pháp man page sau "find repo / (-exec test -d '{}' /. Svn \; -or \ -exec test -d {} /. Git \; -or -exec test -d {} / CVS \ ;) \ -print -prune Hãy xem thử. Chỉnh sửa svn và cvs nếu không được yêu cầu
yên tĩnh_penguin 29/10/18

38

CÂU TRẢ LỜI GỐC : Tính năng này hoạt động khá tốt từ Windows Powershell:

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

CHỈNH SỬA # 1 : Bộ lọc nhanh gấp đôi -Bao gồm. Đây là giải pháp:

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

CHỈNH SỬA # 2 : Keith E. Truesdell đã đề cập đến việc gửi đầu ra vào một tệp. Xem bình luận của anh ấy cho giải pháp đó. Tôi thích đầu ra bảng điều khiển hơn. Nhưng nhận xét của anh ấy khiến tôi nghĩ rằng tôi chỉ thích con đường đầy đủ, không phải toàn bộ mớ hỗn độn được trả về theo mặc định. Nếu bạn muốn đó chỉ là đường dẫn đầy đủ, hãy sử dụng như sau:

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

LƯU Ý CUỐI CÙNG : Các giải pháp trên chỉ trả về kho Git trong thư mục hiện tại . Nếu bạn muốn TẤT CẢ kho lưu trữ trên một ổ đĩa, bạn nên chạy lệnh một lần từ thư mục gốc của mỗi ổ đĩa.


1
rất hữu ích cho người dùng windows! :)
Felix Feliciant

2
Get-ChildItem: Không thể tìm thấy một tham số khớp với tên tham số 'Thuộc tính'. Tại dòng: 1 ký tự: 28
Dewald Swanepoel

@DewaldSwanepoel - Tôi không biết tại sao bạn lại gặp lỗi đó về thông số Thuộc tính. Nó có trong tài liệu một cách rõ ràng và hiện tôi đã thử nó trên một số kết hợp phiên bản Windows / PowerShell. Đối với tôi, Windows 7, 8 và 10 đều hoạt động với các phiên bản PowerShell khác nhau. Nếu bạn DO tìm hiểu tại sao các lỗi xảy ra, xin vui lòng chia sẻ nó ở đây vì vậy chúng tôi có thể học hỏi:>)
bopapa_1979

2
@DewaldSwanepoel - Bạn có thể TỰ TIN nâng cấp phiên bản PowerShell của mình. Chúng tôi làm điều đó với sô cô la. Tôi hiện đang chạy PowerShell phiên bản 5.0 trên Windows 7 tại nơi làm việc.
bopapa_1979

1
@ KeithE.Truesdell - Tôi khá chắc chắn rằng các thuộc tính "Thư mục + Ẩn" là bao gồm và sẽ chỉ tìm kiếm các thư mục. Thêm -Directory của tôi nhanh hơn trong các phiên bản PowerShell mới hơn. Tôi sẽ đi thời gian nó. CHỈNH SỬA - Việc thêm "-Directory" không tạo ra sự khác biệt quan trọng, như tài liệu sẽ chỉ ra. Tuy nhiên, việc thêm Thuộc tính thư mục như bạn đề xuất sẽ làm cho nó chậm hơn. Bây giờ tôi đã biết tại sao, nhưng tôi đã thử nghiệm nó theo cả hai cách với Measure-Command và cả ba cách với thuộc tính Thư mục bổ sung đều chậm hơn cả ba cách không có.
bopapa_1979 Ngày

18

Trên * nix, điều này cũng sẽ tìm thấy bất kỳ --barekho lưu trữ nào .

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

3
Kho lưu trữ trần không cần phải được đặt tên name.gitmà chỉ là một quy ước, mà tôi chẳng hạn, không tuân theo.
Arkaitz Jimenez

3
Cho rằng các kho lưu trữ trống không cần tuân theo quy ước đặt tên đó, có cách nào phổ biến cho findcác kho lưu trữ đó không ?
jmlane

11

Các kho lưu trữ Git đều có HEAD, refsobjectscác mục nhập.

trên GNU / bất cứ thứ gì,

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

Chỉ cần kiểm tra .gitsẽ bỏ lỡ nhiều repo và mô-đun con.

Để hoàn toàn hoang tưởng về việc kiểm tra, bạn có thể yêu cầu git tự thực hiện tất cả các kiểm tra trước khi in,

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

(chỉnh sửa: Tôi nghĩ .git/configtệp cần thiết, hóa ra không phải vậy, vì vậy mức tối thiểu tuyệt đối git init newrepo

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

)



3

Trên Linux và OS X, lệnh sau có thể là nhanh nhất (bỏ qua các kho lưu trữ không có .git) khi thư mục gốc của find/:

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

Nhưng đối với các root có phần lớn kho lưu trữ bên dưới, cách sau có lẽ là nhanh nhất (bạn có thể muốn thay thế /bằng .hoặc root khác):

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

Giải thích nhanh của bầu cử sơ bộ của findsử dụng (vì không có nhà khai thác có mặt ở đây, -andlà tiềm ẩn, tức là cho mỗi nút thăm bầu cử sơ bộ được đánh giá trái sang phải cho đến khi một trong số họ để đánh giá false):

  • -nametruenếu tên khớp (thường, nhưng không khớp ở đây, với các ký tự đại diện)
  • -execthực hiện một lệnh được kết thúc bởi ;(được thoát bởi \để tránh trình bao thông dịch), và truenếu trạng thái trả về là 0(tức là OK). Nút hiện tại có sẵn dưới dạng {}(không cần thoát)
  • -pruneluôn luôn truevà khiến tất cả các nút con bị bỏ qua
  • -type dtruecho thư mục
  • -printở đây là cần thiết vì nếu -execcó thì nó không được thêm vào

2

Trên Linux, hãy thử lệnh này với quyền root:

find / | grep \\.git$

điều này chỉ tìm kiếm mọi tệp kết thúc bằng .git ... bạn có thể làm điều đó với các công cụ tìm kiếm trong Windows, Linux, v.v.


7
Không có ích gì khi cho phép findxuất mọi thứ sau đó lọc với grep. Tôi thà sử dụng--name "*.git"
Gregory Pakosz

2
@Gregory Pakosz: Sự khác biệt là gì?
Michel Gokan

11
@Michel, bạn bắt đầu 2 quy trình và làm cho quy trình đầu tiên truyền toàn bộ /cây thông qua một đường ống cho quy trình thứ hai để grep, khi quy trình đầu tiên có thể làm mọi thứ và tránh sử dụng IO vô ích. Không phải là một sự khác biệt thực sự đối với người dùng thông thường, nhưng đối với các hệ thống tệp lớn, nó có thể tạo ra sự khác biệt.
Arkaitz Jimenez

2
bất kỳ cách nào, nếu bạn muốn sử dụng lệnh JUST find, tốt hơn nên sử dụng -regex thay vì -name ... trong trường hợp này, hãy sử dụng lệnh này: sudo find / -regex '. * \. git'
Michel Gokan

4
@MichelKogan tốt hơn tại sao?
Mark Amery

2

Một phiên bản PowerShell đơn giản:

Get-ChildItem . -Recurse -Hidden .git

1
Điều này đã làm việc cho tôi! Cảm ơn bạn! Tôi đã gặp một số lỗi đối với một số vị trí mà nó cố gắng truy cập mà đang chạy như một người dùng bình thường mà tập lệnh powershell không có quyền truy cập, nhưng khi xem xét thêm, đây là những nơi tôi không nên lo lắng (ví dụ: - C:\users\<username>\PrintHood Ngoài ra, tôi thấy nó hữu ích để thêm một đầu ra vào một tập tin và kể từ khi tôi chỉ quan tâm đến con đường (như kịch bản này được một loạt các thông tin) để cũng lọc chỉ cho thông tin đường dẫn / thư mục. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Keith E. Truesdell

1

Đối với Linux:

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

1

Biến thể nhỏ từ câu trả lời của Eric Burcham. Câu trả lời đó thêm \ .git để kết thúc, câu trả lời này thì không.

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

Tôi sử dụng lệnh này vào đầu ngày. Nó chỉ đơn giản là thêm một vài lệnh git ở trên. Vì một số lý do, kho lưu trữ git của chúng tôi hoạt động tốt nhất nếu một người chạy tìm nạp sau đó kéo, không biết tại sao. Và chúng tôi có rất nhiều mô-đun con vì một số lý do. Dù sao, hãy đặt những gì bạn cần vào giữa các {}.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.