logo头像

Hello World

Git仓库同步附脚本

记一次Git仓库同步

前言

在开发过程中,可能遇到Git仓库搬家或Git仓库同步的窘境,本文记录一次Git仓库同步过程,同样也可用于仓库迁移。

实现思路

  • 环境:
    仅拥有仓库A的读权限,不具备修改和推送的权限。
  • 目标:
    将仓库A的代码定期推送/同步至仓库B

不论何种方法都需要定期更新代码,这块可以使用crontab来简单实现,因此不做详细记录。

需求到了以后,刚毕业的码媛小A接下了此任务,对于不熟悉Git命令的她打算这样开始:

​ 1.将源码目录code拷贝至code_1

​ 2.删除code_1目录下的.git文件夹

​ 3.删除仓库B所有文件

​ 4.重新初始化code_1目录Git仓库并设置远程仓库为仓库B

​ 5.commit文件,推送至远程仓库B

经过一个下午的努力,第一版的同步脚本成功交付,并稳定运行了一段时间。然而过了不久同事过来提了一个严重的问题,这样虽然可以实现需求,但是原始的commit的信息无法保留,当仓库代码发生变动时,无法得知代码变更,这样和传统的FTP传输文件区别不大。

小A抓紧学习了一天Git命令,发现git push --mirror 可以实现代码同步,同时对于仓库A不具有侵入性,便产生了如下思路。

​ 1.获取仓库A最后一次提交的时间

​ 2.使用git push --mirror 将代码推送至仓库B,同时将仓库A最后一次提交时间写入到临时文件/tmp/LAST_MODIFY_TIME

​ 3.在下次执行脚本时,获取最后一次提交时间后,检查提交时间和临时文件里的内容是否一致,一旦不一致继续执行第二步,如果一致则没有代码变更退出程序即可。

Shell脚本实现Git仓库同步/迁移

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
TEMP_FILE="/tmp/LAST_MODIFY_TIME"
cd ~/code/ && modify_time=`git log -1 --format="%ct"`#切换至code目录,并获取最后一次提交时间的时间戳
echo "代码最后一次提交时间:"`git log -1 --format="%ai"` #输出代码最后一次提交时间
if [ -f "$TEMP_FILE" ];then #判断临时文件是否存在,如果存在则读取推送记录修改时间
last_time=`cat $TEMP_FILE`
fi
if [[ $last_time -ne $modify_time ]];then #判断推送记录修改时间和最后一次提交时间是否相同,不同则使用git push --mirror 推送至仓库B
git push --mirror ssh://git@192.168.1.2/develop/code_B.git
echo "推送成功" && echo $modify_time > $TEMP_FILE
else
echo "已经是最新代码,无需推送"
fi

小记

自此小A学会了很多git参数和命令,笔记如下:

1.git log命令可一接受一个–pretty选项,来确定输出的格式.

引用自https://www.cnblogs.com/ckAng/p/11205055.html

比如 :

如果我们只想输出hash.

1
git log --pretty=format:"%h"

详细 命令 :

  • %H: commit hash
  • %h: 缩短的commit hash
  • %T: tree hash
  • %t: 缩短的 tree hash
  • %P: parent hashes
  • %p: 缩短的 parent hashes
  • %an: 作者名字
  • %aN: mailmap的作者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
  • %ae: 作者邮箱
  • %aE: 作者邮箱 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
  • %ad: 日期 (–date= 制定的格式)
  • %aD: 日期, RFC2822格式
  • %ar: 日期, 相对格式(1 day ago)
  • %at: 日期, UNIX timestamp
  • %ai: 日期, ISO 8601 格式
  • %cn: 提交者名字
  • %cN: 提交者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
  • %ce: 提交者 email
  • %cE: 提交者 email (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
  • %cd: 提交日期 (–date= 制定的格式)
  • %cD: 提交日期, RFC2822格式
  • %cr: 提交日期, 相对格式(1 day ago)
  • %ct: 提交日期, UNIX timestamp
  • %ci: 提交日期, ISO 8601 格式
  • %d: ref名称
  • %e: encoding
  • %s: commit信息标题
  • %f: sanitized subject line, suitable for a filename
  • %b: commit信息内容
  • %N: commit notes
  • %gD: reflog selector, e.g., refs/stash@{1}
  • %gd: shortened reflog selector, e.g., stash@{1}
  • %gs: reflog subject
  • %Cred: 切换到红色
  • %Cgreen: 切换到绿色
  • %Cblue: 切换到蓝色
  • %Creset: 重设颜色
  • %C(…): 制定颜色, as described in color.branch.* config option
  • %m: left, right or boundary mark
  • %n: 换行
  • %%: a raw %
  • %x00: print a byte from a hex code
  • %w([[,[,]]]): switch line wrapping, like the -w option of git-shortlog(1)

2.写shell脚本的过程中,小A无意间还学会了linux中date命令的详细使用

1
2
3
4
date +%s  #获取当前时间戳 1598016486
date +%x #获取日期 2020/08/21
date +%X #获取时间 21:27:27
date +%s -r file.jar #获取file.jar文件的时间戳