获取上次提交的git commit哈希,该哈希影响了未在类似.gitignore的文件中列出的文件

时间:2019-07-12 11:25:29

标签: bash git shell

我正在使用CI / CD系统从git存储库中自动构建Docker映像。图片的图片标签对应于相应git commit的短(即8个字符)哈希,例如myimage:123456ab

该存储库包含源代码,这些源代码打包在Docker映像中,并且诸如文档和部署配置之类的内容被使用.dockerignore文件(类似于.gitignore)排除在外。

虽然该过程通常可以正常工作,但它会导致重建和重新部署完全相同的Docker映像,因为仅对不属于该映像的文件(例如存储库README)进行了更改。

仅使用shell(在本例中为bash),git和标准* nix工具,可以获取更改文件的最新提交的简短哈希,而该提交被忽略了.dockerignore文件?这也应涵盖删除不可忽略的文件。

2 个答案:

答案 0 :(得分:2)

您可以结合使用git loggit show来做到这一点。

以下脚本将向后浏览修订历史记录,并发现第一个提交具有.dockerignore不会忽略的更改

for commit in $(git log --pretty=%H)
do
  # Get the changed file names for the commit. 
  # Use `sed 1d` to remove the first line, which is the commit description
  files=$(git show $commit --oneline --name-only | sed 1d)
  if docker-check-ignore $files
  then
     echo $commit
     exit 0
  fi
done
exit 1

然后您可以将docker-check-ignore定义为如下脚本:

#!/bin/sh
DIR=$(mktemp -d)
pushd $DIR
# Set up a temporary git repository so we can use 
# git check-ignore with .dockerignore
git init
popd
cp .dockerignore $DIR/.gitignore
pushd $DIR
git check-ignore $@
# Store the error code
ERROR=$? 
popd
rm -rf $DIR
exit $ERROR

我将减少文件系统操作的次数,而不是为每次提交创建/删除目录。

答案 1 :(得分:1)

$entry->vendors