Прокручування підкаталогів та запуск команди в кожному


47

У мене є набір сховищ, відсортованих за каталогами на основі їх VCS (Git, Mercurial, SVN). За допомогою Subversion я міг запуститись svn update *у батьківському каталозі, і він перегляне кожен каталог і оновить кожне сховище, як очікувалося. Це не стосується Гіта чи Меркуріалу.

Мені б хотілося придумати сценарій bash, який я можу запустити, щоб зробити саме це, переглядати каталоги та будь-які git pullабо hg pullв кожному. Я просто не маю багато досвіду сценаріїв.


Можна було б уточнити, чи хочете ви, щоб команди виконувалися рекурсивно (у всіх підпапках), де відповідь mj41 - це єдиний, який я намагався (звідси та з інших сайтів SO), який це робить.
r_alex_hall

* робить це з твістом, про який я згадую в коментарі до нього.
r_alex_hall

Відповіді:


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

2
Thnx ... але мені потрібно також фіксувати помилки. Як я можу це зробити. Я ніколи раніше не займався програмуванням оболонок.
shashwat

23

Якщо вам потрібно, щоб він був рекурсивним:

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

Це дозволить спуститися до всіх каталогів під поточним і виконати git для тих підкаталогів, які мають каталог .git (ви можете обмежити його -maxdepth).


@thprivileges: розумний!
Денніс Вільямсон

9
-execdirтут набагато краще:find . -type d -name .git -execdir sh -c "pwd && git pull" \;
Даніель Куллманн

Це краща відповідь на мою суб’єктивну думку ... Працювали негайно для мене .. Ура
Воке Рансом Аніхоро

На відміну від питання, яке мене тут пов’язало, ця команда насправді спрацювала. Дякую.
користувач1445967

7

Якщо у вас встановлений паралельний параметр GNU http: // www.gnu.org/software/parallel/, ви можете це зробити:

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

Це працюватиме паралельно, тому якщо деякі мережеві зв’язки git-серверів повільні, це може прискорити роботу.

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


Можливо, ls */переконайтеся, що ви даєте цілісний внесок у cd.
Джо Корнелі

4

Це має спрацювати

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

видалення -maxdepth 1прапора - це єдина команда, яку я знайшов у багатьох пошуках і спробах, що виконує команду рекурсивно (у всіх підкаталогах, а не лише в каталогах на один рівень вниз).
r_alex_hall

0

Зробити це рекурсивно, не використовуючи, findалеforloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.