27

開発環境で複製した 5 つのリポジトリを使用しています。git リポジトリを更新する場合は、フォルダー /home/adrian/repo1/ に入り、次のようにします。

git チェックアウト マスター git pull オリジン マスター

しかし、その後、毎朝、他の 4 つのリポジトリに対して同じことを行う必要があります。これはかなり面倒です。

これをシェルスクリプトに入れることはできますか? つまり、これらの git コマンドをシェル スクリプトに記述して実行すると、すべてのリポジトリを更新できますか?

こんなことを書こうと思っていたのに…

cd repo1
git checkout master 
git pull origin master
cd ..
cd repo2
git checkout master 
git pull origin master
cd ..

(私はLinuxを使用しています)

編集:これは私が思っていたよりも難しいかもしれません。ほとんどの場合、「git pull origin master」を実行すると、「ローカルでの .... への変更はマージによって上書きされます」のようなエラーが発生します。だから私はそれぞれのブランチに入り、ものを隠す必要があります..

編集2:

私が考えているのは、競合が発生した場合、それを無視して次のリポジトリに移動することです

cd repo1
git checkout master 
git pull origin master

(if there is conflict, ignore and go to the next line but dont stop here)

cd ..
cd repo2
git checkout master 
git pull origin master
cd ..

しかし、括弧内の書き方がわかりません。

4

4 に答える 4

6

仕事のために多くの git リポジトリをローカルでチェックアウトしているので、すべてのリポジトリを更新するためのより詳細なスクリプトを作成することにしました (bash スクリプトは、最大 3 フォルダーの深さまでの git リポジトリを検索して更新します。その後、git stash、fetch を実行します) 、rebase、および stash は、ローカルの変更を元に戻します。私のスクリプトは、Windows の git bash シェルで実行されます。

#!/bin/bash
# Usage:
#   ./update_git_repos.sh [parent_directory] 
#   example usage:
#       ./update_git_repos.sh C:/GitProjects/ [MAKE SURE YOU USE / SLASHES]

updateRepo() {
    local dir="$1"
    local original_dir="$2"
    cd $dir # switch to the git repo
    repo_url=$(git config --get remote.origin.url)

    echo "****************************************************************************"
    echo "Updating Repo: $dir with url: $repo_url"
    echo "Starting update in $PWD"

    main_branch="master" 
    if [ "$repo_url" == "git@someserver:repo/repo.git" ]; then # if you have a repo where the primary branch isnt master
        $main_branch="trunk"
    fi

    # update the repo, then stash any local changes
    echo -e "\ncalling: git fetch --all && git stash"
    (git fetch --all && git stash)
    current_branch=$(git rev-parse --abbrev-ref HEAD)

    # switch to master/trunk branch and rebase it, then switch back to original branch
    if [ $current_branch != $main_branch ]; then
        echo -e "\ncalling: git checkout $main_branch && git rebase && git checkout $current_branch"
        (git checkout $main_branch && git rebase && git checkout $current_branch)
    fi

    # rebase the original branch and then stash pop back to original state
    echo -e "\ncalling: git rebase && git stash pop on branch: $current_branch"
    (git rebase && git stash pop ) 

    #switch back to the starting directory
    cd $original_dir
    echo ""
}

directory_to_update=${1}

if [ -z "$directory_to_update" ] ; then
    echo "no directory passed in, using current directory"
    directory_to_update=$PWD
fi 
echo "Updating git repo's in directory: $directory_to_update"
count=0
for dir in $(find $directory_to_update -maxdepth 4 -type d -name .git | xargs -n 1 dirname); do
    updateRepo $dir $directory_to_update #& #uncomment to make it run in multiple threads, meh
    ((count+=1))
done

echo "$count local git repos have been updated!"
于 2016-04-22T18:15:16.460 に答える
0

私はこの質問に関してパーティーに遅れていることを知っていますが、ここに私がまさにこの目的のために書いた小さなシェルスクリプトがあります.

非常にアマチュアっぽく見えるかもしれませんが、それはおそらくそうだからです! 私は主に自分が bash を学ぶのを助けるためにこれを書きましたが、あなた (または今これを読んでいる人) に役立つことを願っています。

これには、削除できる不必要な綿毛がたくさんあります (テキストの色を変更したり、コミットされていない変更を含むリポジトリを一覧表示したりするなど)、削除できます。

レポへのリンクはこちら


#!/bin/bash
declare -a my_array
for f in *; do
    if [ -d "$f" ] ; then
        cd "$f"
        echo -e "\n ------------------ NEW REPOSITORY ------------------\n"
        echo "Now checking $f"
        if [ -d .git ] ; then 
            git add .
            git diff-index --quiet HEAD --
            if [ "$?" -ne 0 ] ; then
                echo "THE REPO NEEDS TO BE COMMITTED"
                my_array=( "${my_array[@]}" "${PWD##*/}" )
            fi
            git status
            git push
            git pull
        fi
        cd ..
    fi
done
RED=`tput setaf 1`
reset=`tput sgr0`
green=`tput setaf 2`
if [ ${#my_array[@]} -ne 0 ]; then
    var=$(IFS=' '; echo "${my_array[*]}")
    var="${RED}$var${reset}"
    if [ ${#my_array[@]} -eq 1 ]; then
        var="The repository $var"
        var="$var has uncomitted changes."
    else
        var="The repositories $var"
        var="$var have uncomitted changes."
    fi
    echo "$var"
于 2019-04-11T05:02:05.203 に答える