自动同步Github的两个代码库 How to synchronize the Github repositories automatically

有时候需要同步两个git代码库,而这两个代码库并不是简单的fork关系。手动执行太烦人了,写了一个自动脚本。

#! /bin/sh

WORKSPACE=sync-git-workspace

SOURCE_GIT_REPO=https://github.com/account_source/source_repo_name.git
SOURCE_BRANCH=master

TARGET_GIT_REPO=https://github.com/account_target/target_repo_name.git
TARGET_BRANCH=master

TARGET_GIT_COMMIT_USERNAME=account_target
TARGET_GIT_COMMIT_EMAIL=account_target@example.com
TARGET_GIT_REPO_USERNAME=account_target
TARGET_GIT_REPO_PASSWORD=********

SYNC_SOURCE_FOLDER=.
SYNC_TARGET_FOLDER=.

SOURCE_FOLDER=`echo ${SOURCE_GIT_REPO%.git} | rev | cut -d'/' -f 1 | rev`
TARGET_FOLDER=`echo ${TARGET_GIT_REPO%.git} | rev | cut -d'/' -f 1 | rev`
TARGET_GIT_REPO_WITH_AUTH=`echo $TARGET_GIT_REPO | sed 's/https:\/\//https:\/\/'$TARGET_GIT_REPO_USERNAME':'$TARGET_GIT_REPO_PASSWORD'@''/'`

cd ~

if [ ! -d "$WORKSPACE" ]; then
    mkdir $WORKSPACE
fi
cd $WORKSPACE

if [ ! -d "$SOURCE_FOLDER" ]; then
    git clone $SOURCE_GIT_REPO
fi

if [ ! -d "$TARGET_FOLDER" ]; then
    git clone $TARGET_GIT_REPO
fi

cd $SOURCE_FOLDER

git reset HEAD --hard && git checkout $SOURCE_BRANCH
git remote update && git pull origin

cd ../$TARGET_FOLDER
git reset HEAD --hard && git checkout $TARGET_BRANCH
git remote update && git pull origin

rsync -av --progress ../$SOURCE_FOLDER/$SYNC_SOURCE_FOLDER ./$SYNC_TARGET_FOLDER --exclude .git

if [ "`git diff`" =  "" ]; then
    echo "Nothing to synchronize. No file is changed."
    exit 0
fi
git add --all

git config user.email $TARGET_GIT_COMMIT_EMAIL
git config user.name $TARGET_GIT_COMMIT_USERNAME
git config push.default simple

git commit -m "Synchronize the source code."
git push --repo=$TARGET_GIT_REPO_WITH_AUTH

echo "Source code is synchronized."
exit 0

存在差分的时候会自动commit,并push到远程分支。

需要设置一下如下变量

SOURCE_GIT_REPO : 源代码库
SOURCE_BRANCH : 需要同步的分支(源代码库)

TARGET_GIT_REPO : 目标代码库
TARGET_BRANCH : 需要同步的分支(目标代码库)

TARGET_GIT_COMMIT_USERNAME : commit时候的author名,这个是可以随意设定的
TARGET_GIT_COMMIT_EMAIL : commit时候的email,其实也是可以随意设定的
TARGET_GIT_REPO_USERNAME : Github的账户,必须是短账户名,不能使用邮件地址
TARGET_GIT_REPO_PASSWORD : Github账户的密码

SYNC_SOURCE_FOLDER : 用于同步的源目录,. 为(源代码库的)根目录
SYNC_TARGET_FOLDER : 用于同步的目标目录,. 为(目标代码库的)根目录

在设定SYNC_SOURCE_FOLDERSYNC_TARGET_FOLDER后,允许只同步部分目录。
比如将源代码库的所有文件同步到目标代码库的abc目录下:

SYNC_SOURCE_FOLDER=.
SYNC_TARGET_FOLDER=abc

保存为sync-git.sh,开跑:

chmod +x sync-git.sh
./sync-git.sh

设定为定时任务:crontab -e

每四小时运行一次脚本:

0 */4 * * * /home/ubuntu/sync-git.sh
2018年8月8日 | 归档于 技术, 程序
标签: , , , ,
  1. 2018年9月23日 09:25 | #1

    还以为博主忘记了他有个博客 :roll:

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: