Состояние Git в нескольких репозиториях на Mac - PullRequest
18 голосов
/ 04 мая 2010

Я какое-то время искал решение этой проблемы и не нашел именно то, что мне нужно.

У меня есть несколько репозиториев Git в папке на моем Mac (OSX 10.6), и мне нужен скрипт или инструмент, который будет циклически проходить по всем репозиториям и сообщать мне, если для любого из них требуется commit ing.

Это моя структура

Sites
  /project1
  /project2
  /project3

Я хочу, чтобы инструмент выполнил git status в Сайтах / проекте1, Сайтах / проекте2, Сайтах / проекте3 и дал мне знать, есть ли какие-либо из них с изменениями или новыми файлами, которые необходимо поставить или зафиксировать.

Ближайший найденный мной скрипт, который может быть взломан здесь, , но даже этот скрипт не запускается, и я получаю ошибку:

"синтаксическая ошибка рядом с неожиданным токеном` do "

который мог быть написан для * nix.

Ответы [ 11 ]

23 голосов
/ 08 июня 2010

Кажется, что на вопрос был получен хороший ответ, но я хотел добавить свои два цента после работы над одной и той же вещью.

Я подошел ближе к ответу jcordasc, используя простой скрипт bash.Я просто сделал одну вещь немного по-другому.Просматривая справочные документы по git, вы можете установить каталог git и рабочий каталог.Это исключает необходимость «cd» в каталогах.Не то, чтобы это действительно имело такое большое значение ...

#!/bin/bash

for gitdir in `find ./ -name .git`; 
    do 
        workdir=${gitdir%/*}; 
        echo; 
        echo $workdir; 
        git --git-dir=$gitdir --work-tree=$workdir status; 
    done

Очевидно, что он более продвинут / чище, как показывает статус '...

12 голосов
/ 06 мая 2010

Есть программа на Python, незафиксированная , которая звучит так, как будто она будет делать именно то, что вы хотите. Для него пока нет поддержки git (только hg и Subversion), но вы можете помочь автору реализовать поддержку git в своем приложении или принять его идеи о том, как реализовать ваши вещи (он документирует свой метод поиска на странице проекта). Я связался с).

5 голосов
/ 17 ноября 2015

Многократная проверка статуса репо с помощью псевдонима одной оболочки. Установка не требуется. Все кредиты: https://coderwall.com/p/grmruq/git-status-on-all-repos-in-folder

Для Баш:

alias gitstat='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c "(echo {} && cd {} && git status -s && echo)" \;'
alias gitstatfull='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c "(echo {} && cd {} && git status && echo)" \;'

или для Cshell

alias gitstat           'find . -maxdepth 1 -mindepth 1 -type d -exec sh -c "(echo {} && cd {} && git status -s && echo)" \;'
alias gitstatfull       'find . -maxdepth 1 -mindepth 1 -type d -exec sh -c "(echo {} && cd {} && git status && echo)" \;'
5 голосов
/ 29 июня 2012

Это более старый вопрос, но я пошёл и обновил ответ jcordasc, чтобы он работал с git 1.7.7.5, и я подумал, что могу также добавить его сюда:

https://gist.github.com/3018100

Эта версия принимает любой путь или пути в качестве аргумента и выдает вывод jcordasc для любого git-репозитория, который он находит в любом месте файловых деревьев, представленных аргументами. Он также поддерживает обнаружение невыдвинутых и необработанных коммитов.

4 голосов
/ 04 мая 2010

Если вы просто хотите статус файлов в локальных репозиториях, то что-то вроде этого: http://gist.github.com/389478 должно сработать. Вам нужно будет изменить шаблон в цикле for, чтобы выбрать любые каталоги, которые вы хотите.

2 голосов
/ 16 декабря 2016

Очень поздно на вечеринку, но я написал инструмент, чтобы сделать это для меня. Это простой сценарий оболочки, и его можно найти на Github.

Это выглядит так:

Projects/fboender/multi-git-status: Uncommitted changes; Projects/fboender/jerrybuild.tst: Needs push (doc, master); Projects/fboender/multi-git-status.bak: Needs push (master); Projects/fboender/tempita: ok; Projects/fboender/dirigent: Uncommitted changes Untracked files; Projects/flusso/boxes: ok; Projects/flusso/docker: ok; Projects/flusso/deployments: ok; Projects/flusso/backup: ok;

2 голосов
/ 22 марта 2014

Тот же вопрос возник и у меня сегодня, и помимо этой страницы, которую я нашел очень полезной и с очень хорошими советами, я также натолкнулся на следующую запись в блоге . Он представляет скрипт Python, который делает именно это:

Usage: show_status [options]

Show Status is awesome. If you tell it a directory to look in, it'll scan
through all the sub dirs looking for a .git directory. When it finds one it'll
look to see if there are any changes and let you know. It can also push and
pull to/from a remote location (like github.com) (but only if there are no
changes.) Contact mike@mikepearce.net for any support.

Options:
  -h, --help            show this help message and exit
  -d DIRNAME, --dir=DIRNAME
                        The directory to parse sub dirs from
  -v, --verbose         Show the full detail of git status
  -r REMOTE, --remote=REMOTE
                        Push to the master (remotename:branchname)
  -p PULL, --pull=PULL  Pull from the master (remotename:branchname)

Все это находится на этом git-репо .

2 голосов
/ 07 сентября 2012

Мне понадобилось немного времени, чтобы получить код от @Andrew Roberts для работы с массивом папок. Если у вас тоже есть проблемы, проверьте мой форк на https://gist.github.com/3666392

Спасибо за отличный сценарий @Andrew Roberts и @jcordasc .. как раз то, что мне нужно.

0 голосов
/ 08 мая 2017

@ oxtay 's ответ самый красивый, поэтому я изменил его, чтобы сделать его еще красивее: https://github.com/Flurrywinde/Git-Status

Я также исправил некоторые ошибки и заставил их работать даже с некоторыми испорченными репозиториями, из-за которых @Ferry Boender выдавал ошибки:

./git-ftp: ok 
./kphotoalbum: ls: cannot access './kphotoalbum/.git/refs/heads': No such file or directory
fatal: Not a git repository: './kphotoalbum/.git'
fatal: Not a git repository: './kphotoalbum/.git'
fatal: Not a git repository: './kphotoalbum/.git'
Uncommitted changes 
./SemanticForms: Uncommitted changes 
./git-big-picture: Uncommitted changes Untracked files 
./10-minute-vim-exercises: ok 
./moviemasher: Uncommitted changes 
./tumbdlwtf: Uncommitted changes 
./rotatezoomHTML5video: Uncommitted changes 
./tumbdl: Needs push (master) 
.: ls: cannot access './python/refs/heads': No such file or directory
fatal: Not a git repository: './python'
fatal: Not a git repository: './python'
fatal: Not a git repository: './python'
Uncommitted changes 
.: ls: cannot access 'mediawiki/refs/heads': No such file or directory
fatal: Not a git repository: 'mediawiki'
fatal: Not a git repository: 'mediawiki'
fatal: Not a git repository: 'mediawiki'
Uncommitted changes 
parser: ls: cannot access 'parser/.git/refs/heads': No such file or directory
fatal: Not a git repository: 'parser/.git'
fatal: Not a git repository: 'parser/.git'
fatal: Not a git repository: 'parser/.git'
Uncommitted changes 
./gundo.orig: Uncommitted changes 
./wikiteam: Uncommitted changes Untracked files

@ Кажется, что у Рубина Нитина есть ошибка, сообщающая [ОШИБКА], когда репо в порядке:

$ git status-all
yourls-popular-clicks-extended                                                     [ERROR]
undefined local variable or method `s' for "yourls-popular-clicks-extended":String
miniProxy                                                                         [master]
dmenu-4.6-kanon          M15U37                                                   [master]
freeCodeCamp                                                                       [ERROR]
undefined method `up_to_date?' for nil:NilClass

$ mgitstatus                       
./yourls-popular-clicks-extended: ok 
./miniProxy: ok 
./dmenu-4.6-kanon: Uncommitted changes Untracked files 
./freeCodeCamp: Untracked files

Обратите внимание, как написано [ОШИБКА] для yourls-Popular-Click-Extended-Free и FreeCodeCamp. У меня и Ферри все правильно.

Mine также сохраняет свои цвета, если выполняется как подпроцесс watch, что позволяет удобно очищать ваши репозитории и видеть, как каждый из них отмечен галочкой в ​​режиме реального времени.

Мой скриншот в сеансе tmux, где я очищаю репозитории

0 голосов
/ 22 декабря 2016

Для этого существует гем ruby, который работает как подкоманда git: https://github.com/reednj/git-status-all

# install the gem    
gem install git-status-all

# use the status-all subcommand to scan the directory
git status-all 

git status all

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...