Git技术问询:非Git受控目录与HEAD差异对比及版本匹配查询
文件目录结构
- TheTree/Archive/.git
- TheTree/Archive/local_copy_of_git_repository_files
- TheTree/Another_copy_of_git_repository_files
背景说明
我们的软件基于Git实现极简版本管理(无分支),Git本地仓库文件存储在TheTree/Archive目录,之后会把这些文件额外复制到TheTree目录供软件实际使用。目前不清楚TheTree目录中的文件对应Git的哪个检出版本,需要解决以下两个问题:
TheTree目录的文件和仓库HEAD版本相比是否存在变更?TheTree的文件匹配哪个Git版本的SHA1密钥?
问题1:检查TheTree文件相对HEAD的变更
因为TheTree不是Git受控目录,直接指定Git仓库位置和目标工作目录,用git diff对比即可:
git --git-dir=TheTree/Archive/.git --work-tree=TheTree diff HEAD
--git-dir:指定Git仓库的.git目录路径--work-tree:指定要对比的目标目录(即TheTree)
执行后,命令会输出所有差异内容;如果没有输出,说明TheTree的文件和HEAD版本完全一致。
问题2:查找TheTree文件匹配的Git版本SHA1
可以通过遍历Git仓库的历史提交,逐个对比提交版本和TheTree目录的文件差异来找到匹配项:
方法1:快速遍历对比
直接用git diff的静默模式遍历所有提交,找到无差异的版本:
git --git-dir=TheTree/Archive/.git --work-tree=TheTree log --all --full-history --pretty=format:"%H" | while read commit_sha; do git --git-dir=TheTree/Archive/.git --work-tree=TheTree diff --quiet $commit_sha if [ $? -eq 0 ]; then echo "匹配的版本SHA1:$commit_sha" break fi done
--quiet参数让git diff只返回状态码,无差异时返回0,找到后直接输出对应的SHA1。
方法2:哈希快照对比(适合大仓库优化)
如果仓库提交历史很多,先生成TheTree的文件哈希快照,再和提交版本的快照对比:
- 生成
TheTree的文件哈希列表:
cd TheTree find . -type f -exec sha1sum {} \; | sort > /tmp/thetree_sha1s.txt
- 遍历Git仓库提交,生成每个版本的哈希快照并对比:
cd TheTree/Archive git log --pretty=format:"%H" | while read commit_sha; do git archive --format=tar $commit_sha | tar -xO | sha1sum | sort > /tmp/commit_sha1s.txt diff /tmp/thetree_sha1s.txt /tmp/commit_sha1s.txt > /dev/null if [ $? -eq 0 ]; then echo "匹配的版本SHA1:$commit_sha" break fi done
内容的提问来源于stack exchange,提问作者user3503533
相关产品推荐
相关产品推荐

