GIT: есть ли способ зафиксировать несколько репозиториев?

#git

#git

Вопрос:

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

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

 git add -u 
git add .
git commit -m 'Latest'
 

Итак, я мог бы просто записать компакт-диск в какую-нибудь папку, а затем запустить команду, которая обновит их все?

Это не вопрос о подмодулях

Комментарии:

1. Возможно, ответ — a .sh

2. Хотя есть способы сделать это, я даже не рекомендую делать это для одного репозитория, не говоря уже о нескольких из них. Я думаю, что обработка ваших коммитов как «мини-обзоров кода» очень помогает в сохранении чистой истории, что в долгосрочной перспективе очень помогает в обслуживании кода: исправления ошибок перекрестной ревизии, удаление нежелательных исправлений и т. Д.

3. Вы действительно не видели первое, что я написал ?!

4. Я сделал. Но я ненавижу работать с репозиториями со случайными коммит-кодами, поэтому я не могу удержаться от того, чтобы везде помещать приведенный выше комментарий. 🙂

Ответ №1:

почему бы вам не использовать что-то вроде этого:

 #!/bin/bash
for DIR in `ls`;
do
    if [ -d $DIR/.git ];
    then
            echo "updating location: " $DIR;
            cd $DIR
            # your commands here...
            git add -u 
            git add .
            git commit -m 'Latest'

            cd ..
    fi
done
 

Комментарии:

1. можете ли вы сделать так, чтобы это было копирование и вставка? Я не уверен, как добавить свои команды :

2. @Kirk: Я надеюсь, что вы используете систему * nix, поэтому вам просто нужно буквально размещать команды из вашего серого поля между # your commands here... и cd ..

3. @Scolytus это должно работать также в mingw (протестировано), msysgit (не протестировано) в Windows.

4. О, это всегда приходит с /bin/bash ? Полезно знать… Я думаю, вам также придется сообщить Windows, как выполнить скрипт или выполнить его из оболочки mingw, верно?

5. первая строка предназначена для того, чтобы оболочка знала, какой интерпретатор использовать. Вы можете использовать любую оболочку, которая вам нравится, если код совместим с ней. Если вы запустите из mingw, это сработает, потому что в mingw есть /bin/bash .

Ответ №2:

Может быть, вы ищете что-то вроде mr (домашняя страница). Я использую его для одновременного обновления нескольких репозиториев, но его можно настроить для выполнения любых действий, которые вы хотите. Он также доступен как пакет Ubuntu и Debian в официальных репозиториях. В противном случае вы можете просто написать скрипт, который сделает все за вас.

Комментарии:

1. Звучит многообещающе, могу ли я установить исходный код и, скажем, оставить subversion (iihh) подальше? На своем сайте вы предлагаете git clone, для чего он нужен?

Ответ №3:

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

Я написал gitglue. Вы можете помечать репозитории тегами и выполнять произвольные команды на основе тегов. Ознакомьтесь с этим руководством по gitglue или fork gitglue на Github.

Ответ №4:

Я использую скрипт bash (в моем .bashrc ) для многократного запуска одной и той же команды git в нескольких репозиториях. Bash жестко определяет местоположение репозитория, но его можно легко изменить. Одной из проблем, связанных с многократным выполнением одной и той же команды, является правильная передача " аргументов в кавычках, обычно -m " commit message"

Я запускаю эту команду следующим образом:

mgit commit -a -m "my commit message" где mgit — это псевдоним в моем .bashrc.

Это работает для любого git commant (по крайней мере, для того, который я тестировал и использовал ежедневно), например:

mgit status -uno , mgit pull

функция, анализирующая аргументы git

Эта функция гарантирует, что любой аргумент в кавычках (после -m правильной обработки)

 parse_git_args()
{
    git_args=""
    end_comment=""
    for var in "$@"
    do
        if [[ $var == '-m' ]];
        then
            git_args =" -m ""
            end_comment=""" 
        else
            git_args =" $var"
        fi
    done
    git_args =$end_comment

    echo $git_args
}
 

функция, выполняющая одну и ту же команду в нескольких репозиториях

 multiple_git_func()
{
    start=$(pwd)
    git_args=$(parse_git_args $@)
    root=`git rev-parse --show-toplevel` #find the repo from which the command was run

    # go to root apply command and then go to sub repos (hardcoded location wrt root)
    cd $root
    echo "=============================="
    echo "issuing git $git_args on $root"
    eval "git $git_args"


    cd repo2 # repo2 is installed in root, could be anywhere else relative to root
    echo "=============================="
    echo "issuing git $git_args on repo2"
    eval "git $git_args"
   
    #go back to initial folder
    cd $start
}
 

псевдоним в .bashrc

alias mgit=multiple_git_func