2012-01-12 36 views
5

Tôi muốn biết nếu có cách xác định thư mục con nào trong thư mục được chỉ định là các dự án git. Sau đó, kiểm tra xem các dự án git nào cần cập nhật thông qua 'git fetch' hoặc ngược lại.Kiểm tra đệ quy các cập nhật thư mục git

Ví dụ, tôi có một thư mục được gọi là phát triển trong thư mục chính của tôi, chứa nhiều dự án khác nhau với khoảng 10% trong số chúng sử dụng git. Thay vì kiểm tra bản cập nhật dự án riêng lẻ, tôi muốn có thể chạy lệnh kiểm tra mọi bản cập nhật cho tất cả thư mục git trong thư mục phát triển.

Sẽ thật tuyệt nếu có thể cập nhật các dự án không xung đột.

Trả lời

3

Một cách để có được một danh sách tất cả các hợp đồng mua Git dưới thư mục hiện tại của bạn là với lệnh sau đây:

find . -name '.git' | xargs -n 1 dirname 

Sau đó, bạn có thể ăn này vào một kịch bản shell chạy lệnh của bạn được lựa chọn trong mỗi kho, hoặc bằng cách thay đổi thư mục hoặc bằng cách sử dụng các đối số --git-dir--work-tree của Git.

+0

Bạn có thể giải thích đối số -n sau đó trong lệnh xargs không. Tôi đã xem các trang của người đàn ông, tuy nhiên tôi vẫn không chắc chắn về chức năng mà nó thực hiện. –

+0

@MrAxilus xargs thường sử dụng tất cả đầu ra dưới dạng tham số dòng lệnh cho lệnh được chỉ định (nó là dirname trong trường hợp của chúng tôi). -n yêu cầu chia tất cả các phần 1 từ và nhập dirname cho mỗi phần. –

+0

@AlexandrPriymak, tôi hiểu. Nó sẽ không tốt hơn để sử dụng đối số -exec của find? –

1

Hãy xem số repo của Android. Tôi nghĩ rằng không có gì android cụ thể trong đó và bạn sẽ có thể thích nghi nó với nhu cầu của bạn.

+0

Hmm, chính xác thì repo làm gì mà git thì không? –

3

Dưới đây là một (hacky) one-liner cho rằng:

back=`pwd`; for d in `find . -type d -name .git` ; do cd "$d/.."; git pull ; cd $back ; done 
+0

cuộc sống tiết kiệm lol :) –

1

Nói tóm lại:

find . -name .git -execdir git pull -v ';' 

Bạn cũng có thể tạo ra các kịch bản sau đây (ví dụ update_src.sh):

#!/bin/sh 
# Script to pull all git repositories to the recent version. 
ROOT=$(git rev-parse --show-toplevel 2> /dev/null) 
find "$ROOT" -name .git -type d -execdir git pull -v ';' 

hoặc tạo bí danh sau trong vỏ:

alias git-pull-all='find $(git rev-parse --show-toplevel 2> /dev/null) -name .git -type d -execdir git pull -v ";"' 

hoặc trong số ~/.gitconfig.

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