Git Статус через несколько репозиториев на Mac

Я искал какое-то решение для этого и не нашел абсолютно то, что мне нужно.

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

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

Sites
  /project1
  /project2
  /project3

Я хочу, чтобы инструмент выполнял git status в сайтах /project 1, Sites/project2, Sites/project3 и сообщал мне, есть ли у кого-либо из них изменения или новые файлы, которые необходимо выполнить или выполнить.

Ближайший script Я обнаружил, что может быть hackable здесь,, но даже если script не будет запущен, а я получить сообщение об ошибке:

"синтаксическая ошибка около неожиданного токена` do"

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

Ответ 1

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

Ответ 2

Кажется, на вопрос ответили хорошо, но я хотел бросить свои два цента после работы над тем же.

Я подошел ближе к ответу jcordasc, используя простой bash script. Я просто немного изменил ситуацию. Глядя на справочные документы для 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

Очевидно, что он более продвинутый/очиститель для того, как он показывает статус "...

Ответ 3

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

https://gist.github.com/3018100

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

Ответ 4

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

Ответ 5

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

Для bash:

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)" \;'

Ответ 6

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

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

Ответ 7

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

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 [email protected] 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 repo.

Ответ 8

Это простой способ сделать такие вещи в одном слое. Я пропустил один последний шаг, который я добавлю, когда узнаю (если кто-то еще этого не знает).

При a git status вы можете сделать:

find ./Sites -name .git | awk '{ print "git --git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " status" }'

затем скопируйте вывод и выполните его.

Для полного diff вы можете запустить:

find ./Sites -name .git | awk '{ print "git --git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " --no-pager diff" }'

Копирование-вставка, которую вы должны сделать, меня раздражает. Он также должен использовать там xargs, но как-то git жалуется:

find ./Sites -name .git | awk '{ print "--git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " --no-pager diff" }' | xargs git

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

Ответ 9

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

Он выглядит следующим образом:

Проекты/fboender/multi-  git -status: Неопределенные изменения; Проекты /fboender/jerrybuild.tst: Требуется push (doc, master); Проекты /fboender/multi - git -status.bak: Требует push (master); Проекты /fboender/tempita: ok; Проекты /fboender/dirigent: Uncommitted changes Исключенные файлы Проекты /flusso/boxes: ok; Проекты /flusso/docker: ok; Проекты /flusso/deployments: ok; Проекты /flusso/backup: ok;

Ответ 10

Существует также рубиновый жемчуг для этого, который работает как вспомогательная команда 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

Ответ 11

@oxtay ответ самый красивый, поэтому я его модифицировал, чтобы сделать его еще красивее: 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

Обратите внимание на то, как он говорит [ОШИБКА] для ваших популярных пользователей click-free и freeCodeCamp. Шахта и паром верны.

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

Снимок экрана моей сессии tmux, где я очищаю репозитории