2009-05-03 7 views
49

Настройка проекта проста в git, поэтому я могу иметь отдельный репозиторий даже для небольшого скрипта. Теперь проблема заключается в том, как управлять ими.Управление множеством репозиториев git

Я работаю в нескольких местах с этими репозиториями. Когда я внес изменения в какой-либо репозиторий, я хочу обновить репозитории в других местах.

У меня есть каталог со многими хранилищами в нем.

  1. Как я могу взять их все?
  2. Как проверить, не имеют ли какие-либо из них незафиксированные изменения?
  3. Как я могу проверить, есть ли у кого-либо из них изменения для слияния?

И было бы неплохо иметь возможность сделать это с помощью одной команды.

Выход должен быть достаточно тихим, чтобы фактически заметить, что нужно делать.

+0

Тот же вопрос [ответил] (https://stackoverflow.com/a/48790388/2192488) для 'hg mercurial'. –

ответ

-1

Похоже, написать сценарий для этого довольно просто. По сути, он должен перебирать репозитории, а затем использовать команды, такие как git ls-files, git diff и git log.

+0

Я знаю, что поздно, но вы можете опубликовать сценарий? – l0b0

+0

Нет «сценария». Я использую сценарий, который я написал для своих нужд, но он не является общим. – iny

+0

«git diff» на самом деле сложно, если вы хотите получить один файл diff, который можно вернуть и повторно применить с помощью одной команды patch. – proski

6

Вы можете попытаться использовать repo с настраиваемым файлом manifest.xml, чтобы указать, где находятся ваши репозитории. Существует some documentation о том, как это сделать.

В качестве альтернативы вы можете использовать git-submodule(1).

+1

git-subodule был бы хорош, если бы я захотел сохранить репозитории в одном и том же состоянии, но это не так. Набор репозиториев не одинаковый в каждом месте. Могут быть непредвиденные изменения. Могут быть изменения, которые я еще не хочу сливать. – iny

+0

Я не знал о git-подмодуле. Спасибо, что упомянул об этом. – sykora

+0

Документация для репо довольно минимальна и выглядит так, как будто она предназначена для разных видов работы, которые я хочу использовать. – iny

0

Вы должны проверить rgit на CPAN, который рекурсивно выполняет команды git во всех репозиториях в дереве каталогов.

Из документов:

Эта утилита рекурсивно ищет в корневой каталог с (который может быть как текущего рабочего каталога или - если он был установлен - каталог, данное переменная окружения GIT_DIR) для всех репозиториев git, отсортируйте этот список по пути хранилища, chdir в каждого из них и выполните указанную команду git .

3

Я использую этот скрипт, чтобы легко выполнять команды git во всех моих хранилищах.

#!/bin/sh 
if [ ! "$1" = "" ] ; then 

    if [ "$GITREPO" = "" -a -d "$HOME/cm/src" ] ; then 
     GITREPO="$HOME/cm/src" 
    fi 

    if [ "$GITREPO" != "" ] ; then 

     echo "Git repositories found in $GITREPO" 
     echo "-=-=-=-=-=-=-=-=-=-=-=-=-=-" 

     DIRS="`/bin/ls -1 $GITREPO`" 

     for dir in $DIRS ; do 

     if [ -d $GITREPO/$dir/.git ] ; then 
      echo "$dir -> git $1" 
      cd $GITREPO/$dir ; git [email protected] 
      echo 
     fi 

     done 
    else 

     echo "Git repositories not found." 

    fi 
fi 

По умолчанию скрипт будет искать Git репозиториев в ~/см/ЦСИ, но вы можете изменить это, установив переменную окружения GITREPO по своему вкусу.

Этот сценарий основан на this script.

37

Я настоятельно рекомендую инструмент для нескольких репозиториев mr. Я использовал, чтобы использовать скрипт пользовательской оболочки, как другие рекомендуются в течение некоторого времени, но с использованием MR имеет следующие преимущества для меня:

  • Это родовое: конъюнкции различных систем управления версий может быть использована не только мерзавец (например, Mercurial, SVN и т. д.).
  • Это быстро: mr может выполнять несколько заданий параллельно. Я использую несколько git/mercurial репозиториев и синхронизирую их несколько раз в день. Г-н значительно ускоряет этот процесс.
  • Легко и быстро управлять списком проверок репозитория. Просто используйте «mr register», а не изменяйте список проектов в своем пользовательском скрипте.

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

Я использую следующий псевдоним для команды мр, чтобы гарантировать, что господин всегда подхватывает мой список проектов по умолчанию, хранящуюся в $ HOME, и использует 5 параллельных потоков:

alias mr='mr -d ~/ -j 5 ' 
+3

Поддерживает ли Windows? –

+0

@FitzchakYitzchaki No: http://myrepos.branchable.com/install/ –

+0

это замечательно, но не поддерживает git-тегирование (по состоянию на 2016-08) –

4

gitslave является инструментом, который может запустить такую ​​же команду над множеством репозиториев, создавая взаимосвязь суперпроекта/подпроекта между супер и субмариной. Это (по умолчанию) обеспечивает обобщение вывода, поэтому вы можете сосредоточиться на репозиториях, которые предоставляют уникальный вывод (полезно для git-статуса, не так полезного для git ls-файлов).

Это обычно используется для проектов, в которых вам необходимо собрать несколько хранилищ вместе и сохранить их в одной ветви или теге одновременно или что угодно. Для моего каталога (босые) репозиториев я просто немного Makefile, который позволяет мне запускать произвольные команды Git, которые, как вы видите, я в первую очередь использовать для FSCK и дс:

full: fsck-full gc-aggressive 
     @: 

fsck-full: 
     for f in */.; do (cd $$f; echo $$f; git fsck --full || echo $$f FAILED); done 

gc-aggressive: 
     for f in */.; do (cd $$f; echo $$f; git gc --aggressive || echo $$f FAILED); done 

%: 
     for f in */.; do (cd $$f; git [email protected] || echo $$f FAILED); done 
9

Я должен сказать, что я начал с Принятая в настоящее время ответ (просто куча скриптов помощников, которые перебирают репозитории), но в целом это был недостающий опыт для меня.

Итак, после попыток mr, repo и git-подмодулей, я обнаружил, что каждый из них не имеет другого способа, поэтому я закончил свой собственный вариант: http://fabioz.github.io/mu-repo, который является зрелым инструментом на данный момент, с рабочими потоками, которые позволяют клонировать множественные репозиции, различать (и редактировать) их, просматривать входящие изменения и т. д.

-1

https://github.com/wwjamieson3/envisionTools имеет сценарий bash, называемый gitstat, который делает это и многое другое. Совместимость с GNU и Mac. Он может выполнять выборки из пультов, если их спрашивают. В нем отображаются не проверенные, измененные, добавленные, удаленные и поэтапные файлы. Он отличается от пультов, демонстрируя невмешаемые коммиты на пульты дистанционного управления и неровные локальные коммиты. Он также может отображать цветовые коды в сводном или подробном режиме и даже в формате HTML. Он использует локацию вместо поиска, потому что она бесконечно быстрее и даже предложит обновить вашу базу данных локации, если она становится слишком старой.

+2

Спасибо за сообщение! Обязательно внимательно прочитайте [FAQ по самопомощи] (http://stackoverflow.com/faq#promotion). Также обратите внимание, что * требуется *, что вы публикуете отказ от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт/продукт. –

+3

К сожалению, ссылка github wwjamieson3/envisionTools нарушена. –

+0

@williamJamieson is envisionTools - это частный репозиторий GitHub? – eebbesen

9

gr (git-run) расширяет функциональность mr (только для git). Мне проще организовать несколько git-репозиций, используя свою систему тегов. Однако код для gr не поддерживается. Если вы используете bash, убедитесь, что вы используете его с -t tag вместо формы #tag.

+0

Похоже, что с тех пор разработка немного подбиралась: https://github.com/mixu/gr/graphs/contributors –

0

Если кто-то еще смотрит на эту тему, пожалуйста, проверка мой сценарий оболочки называется gitme

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

вы можете запустить git clone https://github.com/robbenz/gitme.git

также скрипт размещен ниже

#!/bin/bash -e 

REPOS=( 
/Users/you/gitrepo1 
/Users/you/gitrepo2 
/Users/you/gitrepo3 
/Users/you/gitrepo4 
) 

MOVE="Moving to next REPO... \n" 

tput setaf 2;echo "What ya wanna do? You can say push, pull, commit, ftp push, or status"; tput sgr0 

read input 

if [ $input = "commit" ] 
then 
    tput setaf 2;echo "Do you want a unique commit message? [y/n]";tput sgr0 
    read ans 
    if [ $ans = "y" ] 
    then 
     for i in "${REPOS[@]}" 
     do 
      cd "$i" 
      tput setaf 6;pwd;tput sgr0 
      git add . -A 
      read -p "Commit description: " desc 
      git commit -m "$desc" 
      tput setaf 2;echo $MOVE;tput sgr0 
      sleep 1 
     done 
    else 
     for i in "${REPOS[@]}" 
     do 
      cd "$i" 
      tput setaf 6;pwd;tput sgr0 
      git add . -A 
      git commit -m "autocommit backup point" 
      tput setaf 2;echo $MOVE;tput sgr0 
      sleep 1 
     done 
    fi 
elif [ $input = "push" ] || [ $input = "pull" ] || [ $input = "ftp push" ] || [ $input = "status" ] 
    then 
     for i in "${REPOS[@]}" 
do 
    cd "$i" 
    tput setaf 6;pwd;tput sgr0 
    git $input 
    tput setaf 2;echo $MOVE;tput sgr0 
    sleep 1 
    done 
else tput setaf 1;echo "You have zero friends";tput sgr0 
fi 

I установки псевдонима в моем ~/.bash_profile так alias gitme='sh /path/to/gitme.sh'

1

Я только что создали инструмент, сделать то, что вы хотите!

  1. Как я могу взять их все? gmaster fetch
  2. Как я могу проверить, не имеют ли какие-либо из них незафиксированные изменения? gmaster status
  3. Как я могу проверить, есть ли у кого-либо из них изменения для слияния? gmaster status

Это называется gitmaster: https://github.com/francoiscabrol/gitmaster

2

Вы можете использовать git-status-all камень для этого: 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 --fetch 

git status all

+1

Очень хороший подход. В отличие от большинства вышеперечисленных инструментов, нет необходимости сначала регистрировать репозитории, а просто проверяет все подкаталоги. – luator

Смежные вопросы