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, где я очищаю репозитории