制作一个shell脚本来更新3 git repos

时间:2013-06-14 00:58:10

标签: git shell

我正在使用我在开发环境中克隆的5个回购。 当我想更新git repo时,我输入文件夹/ home / adrian / repo1 /并执行:

git checkout master git pull origin master

但是,每天早上我必须为其他4个回购做同样的事情。这很麻烦。

我可以将它放在shell脚本中吗?我的意思是,如果我在shell脚本中编写这些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 个答案:

答案 0 :(得分:23)

首先,我recommend against using git pull。相反,请创建一个更安全的git up别名:

git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'

有关git up的解释,请参阅this answer

然后你可以安全地编写脚本:

#!/bin/sh
for repo in repo1 repo2 repo3 repo4; do
    (cd "${repo}" && git checkout master && git up)
done

答案 1 :(得分:4)

由于我有很多git repo在本地检查工作,我决定写一个更详细的脚本来更新所有repo(bash脚本将搜索最多3个文件夹的git repos)然后它将执行git stash,fetch,rebase和stash pop本地更改。我的脚本在windows上的git bash shell中运行。

id="ta1"

答案 2 :(得分:0)

我知道我在这个问题上真的很晚了,但是这是我为这个确切目的编写的一些shell脚本。

这似乎很业余,但是那是因为!我主要是为了帮助自己学习bash而写的,但是希望它对您(或现在正在阅读的人)有所帮助。

您可以删除许多不必要的绒毛(例如更改文本的颜色,并列出未提交更改的存储库)。

回购链接为here


#!/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"

答案 3 :(得分:0)

我建议使用cron脚本管理所有存储库的更新。
这是auto update上游脚本的示例脚本。

#!/bin/bash

repo_update() {
    echo -e "\nUpdating $1" && cd $1
    if [[ `git rev-parse --abbrev-ref HEAD` != master ]]; then git checkout master; fi
    GIT_URL=$(git config --get remote.origin.url) && REMOTE=${GIT_URL##*:}
    REMOTE=https://api.github.com/repos/${REMOTE%.*}

    UPSTREAM=$(curl -s $REMOTE | jq -r '.parent.ssh_url')
    if [[ $UPSTREAM == null ]]; then return 1; fi
    if grep -q $UPSTREAM << EOF
    `git remote -v`
EOF
    then
        git remote set-url upstream $UPSTREAM
    else
        git remote add upstream $UPSTREAM
    fi

    git fetch --prune upstream
    if [[ `git rev-list HEAD...upstream/master --count` == 0 ]]
    then
        echo -e "all the same, do nothing"
    else
        echo -e "update exist, let's checking!"
        git pull --rebase upstream master
        git reset --hard upstream/master
        push $GIT_URL
    fi
}

# Check connection
ssh-add -l &>/dev/null
if [[ "$?" == 2 ]]; then eval `ssh-agent` > /dev/null; fi

# Check identity
ssh-add -l &>/dev/null
if [[ "$?" == 1 ]]; then expect $HOME/.ssh/agent > /dev/null && ssh-add -l; fi

# Update repositories
find ~/.gits -maxdepth 1 -mindepth 1 -type d | while read repo; do repo_update $repo; done