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


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.