2009-06-07 22 views
14

Tôi có một bó (10-15) của kho git địa phương nơi nào đó trên hệ thống tập tin của tôi, nhưng tất cả trong thư mục/data/git: Tìm tất cả người dân địa phương Repos uncommited trong một cây thư mục

Tôi muốn tìm tất cả/bất kỳ thư mục nào có thay đổi không được sửa đổi. Làm thế nào tôi có thể làm điều đó? Loại giống như một biến thể toàn cầu đệ quy git status.

Tất cả các câu trả lời đều sai. Bất kỳ lệnh git nào cũng chỉ hoạt động trong thư mục nằm dưới quyền kiểm soát git. Tôi cần một cái gì đó để tìm kiếm các thư mục như vậy.

Vì vậy, thay vào đó tôi đã viết kịch bản này mà thực hiện điều này:


#!/usr/bin/env ruby 
require 'find' 
require 'fileutils' 

#supply directory to search in as argument 

@pat = ARGV[0] 
(puts "directory argument required"; exit) unless @pat 
Dir.chdir(@pat) 
Find.find(@pat) do |path| 
    if FileTest.directory?(path) 
    Dir.chdir(path) 
    resp = `git status 2>&1` 
    unless resp =~ /fatal|nothing to commit \(working directory clean\)/i 
     puts "#{'#'*10}\n#{Dir.pwd}#{'#'*10}\n#{resp}" 
     Find.prune 
    end 

    Dir.chdir(@pat) 
    end 
end 
 

Trả lời

6

cái gì đó dọc những dòng này?

 
$ for i in /data/*/; do (cd $i && (echo $i; git status)); done 
$ for i in /data/*/; do (cd $i \ 
> && (git status | grep -qx 'nothing to commit (working directory clean)' \ 
> || (echo $i && git status))); done 
+0

Không sử dụng git-trạng thái. Sử dụng git-ls-files và git-diff/git-diff-files. –

+0

Điều gì sai với trạng thái git? – Bombe

+4

git-status được gọi là sứ và nó có nghĩa là cho người dùng, chứ không phải cho kịch bản. Sản lượng của nó có thể thay đổi mà không cần thông báo. –

0

Bạn có thể sử dụng "git ls-files --modified --deleted --exclude tiêu chuẩn" để liệt kê tất cả các file sửa đổi và xóa (--exclude-standard không có lẽ là cần thiết ở đó, nhưng chỉ trong trường hợp bạn muốn liệt kê tất cả các file chưa biết không bị bỏ qua với --other ...). Sau đó bạn có thể kiểm tra xem đầu ra của lệnh này có trống không.

Hoặc bạn có thể kiểm tra trạng thái thoát của "git diff - HEAD chính" nếu bạn muốn kiểm tra xem "git commit -a" có nhận bất kỳ thứ gì hay "git diff --cached --quiet HEAD" nếu bạn muốn kiểm tra xem "git commit" có chọn bất kỳ thứ gì (hoặc một trong những người thân ống nước của nó: git-diff-files hoặc git-diff-index).

0
for rp in /srv/*/ 
do 
    printf '\ec' 
    cd "$rp" 
    git status 
    echo "${rp%/}" 
    read 
done 

Example

4

Tôi không nghĩ rằng git có này xây dựng trong, vì vậy tôi (cũng) đã tạo ra một kịch bản để làm điều này: https://github.com/mnagel/clustergit

Vấn đề với các đoạn được đăng ở đây là họ phá vỡ như là định dạng đầu ra của git status thay đổi. Kịch bản của tôi có cùng một vấn đề (vì nó cơ bản hoạt động theo cùng một cách), nhưng ít nhất bạn luôn nhận được phiên bản mới nhất. enter image description here

+0

Tôi thích tập lệnh này! – ben

0

Nó không phải rất ưa thích để định dạng nhưng làm thế nào về một cái gì đó giống như

find . -iname ".git" -type d | sed -rne "s|(.+)/\.git|echo \1;cd \1;git status;cd /data|p" | bash 
10

Lệnh find là bạn của bạn, cùng với một số kỳ diệu vỏ.

find . -type d -name '.git' | while read dir ; do sh -c "cd $dir/../ && echo -e \"\nGIT STATUS IN ${dir//\.git/}\" && git status -s" ; done 

từ: https://gist.github.com/tafkey/664266c00387c98631b3

+2

Sẽ hữu ích nếu bạn giải thích lệnh đó đang làm gì. –

Các vấn đề liên quan