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 đó?
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 đó?
Câu trả lời:
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 .git
các thư mục được đặt tên.
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
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.
Trên * nix, điều này cũng sẽ tìm thấy bất kỳ --bare
kho lưu trữ nào .
find / -name "*.git" -type d
name.git
mà chỉ là một quy ước, mà tôi chẳng hạn, không tuân theo.
find
các kho lưu trữ đó không ?
Các kho lưu trữ Git đều có HEAD
, refs
và objects
cá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 .git
sẽ 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/config
tệ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
là
mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD
)
Trên Linux, một cách nhanh hơn sẽ là:
locate -r "\.git$"
giả sử bạn tiếp tục cập nhật cơ sở dữ liệu của định vị với sudo updatedb
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
là /
:
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 find
sử dụng (vì không có nhà khai thác có mặt ở đây, -and
là 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
):
-name
là true
nếu tên khớp (thường, nhưng không khớp ở đây, với các ký tự đại diện)-exec
thự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à true
nế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)-prune
luôn luôn true
và khiến tất cả các nút con bị bỏ qua-type d
là true
cho thư mục-print
ở đây là cần thiết vì nếu -exec
có thì nó không được thêm vàoTrê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.
find
xuất mọi thứ sau đó lọc với grep
. Tôi thà sử dụng--name "*.git"
/
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.
Một phiên bản PowerShell đơn giản:
Get-ChildItem . -Recurse -Hidden .git
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
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