42

У меня есть набор репозиториев, отсортированных по каталогам на основе их VCS (Git, Mercurial, SVN). С Subversion я смог запустить svn update * в родительском каталоге, и он будет циклически проходить по каждому каталогу и обновлять каждый репозиторий, как и ожидалось. Это не относится к Git или Mercurial.

Я хотел бы придумать скрипт bash, который я могу запустить, чтобы сделать именно это, перебирать каталоги и либо git pull либо hg pull в каждом. У меня просто нет большого опыта написания сценариев bash.

5 ответов5

74
for dir in ~/projects/git/*; do (cd "$dir" && git pull); done
20

Если вам нужно, чтобы он был рекурсивным:

find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;

Это опустится во все каталоги под текущим и выполнит git pull для тех подкаталогов, которые имеют каталог .git (вы можете ограничить его с помощью -maxdepth).

7

Если у вас установлен GNU Parallel http:// www.gnu.org/software/parallel/, вы можете сделать это:

cd ~/projects/git/; ls | parallel 'cd {} && git pull'

Это будет работать параллельно, поэтому, если некоторые из сетевых соединений git-серверов работают медленно, это может ускорить процесс.

Посмотрите вступительное видео для GNU Parallel, чтобы узнать больше:http://www.youtube.com/watch?v=OpaiGYxkSuQ

3

Это должно работать

find . -maxdepth 1 -type d -name '.git' -exec sh -c 'cd "{}" && pwd && git pull' \;
0

Сделать это рекурсивно без использования find но forloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .