我正在使用我在开发环境中克隆的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 ..
但我不知道如何在括号中写出这个东西。
答案 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