git - 查找缺少 .git 目录的工作目录的 Git 修订版

标签 git find revision working-directory

我有 a) 一个没有 .git 目录的工作目录和 b) 一个存储库。 ab 历史中间的一些修改。

我如何找出 ab 匹配的版本?

我想到了一个 shellscript 从工作目录到所有修订执行 diff 并选择差异最小(希望为 0)的那个。

这会有点原始(而且我不确定该怎么做),有没有更简单的方法?

最佳答案

你可以写一个脚本来运行diff gitdir workdir | wc -c 每次提交。然后你可以整理结果并说出差异最小的提交(由 wc -c 衡量)是最接近裸工作目录的提交。

这是它在 Python 中的样子:

find_closest_sha1.py:

#!/usr/bin/env python
import subprocess
import shlex
import sys
import os
import operator

gitdir,workdir=map(os.path.realpath,sys.argv[1:3])
os.chdir(gitdir)
proc=subprocess.Popen(shlex.split('git rev-list --all'),stdout=subprocess.PIPE)
shas,err=proc.communicate()
shas=shas.split()
head=shas[0]
data={}
for sha1 in shas:
    subprocess.Popen(shlex.split('git checkout {s}'.format(s=sha1)),
                          stderr=open('/dev/null')).wait()
    proc=subprocess.Popen(shlex.split('diff {g} {w}'.format(g=gitdir,w=workdir)),
                          stdout=subprocess.PIPE)
    out,err=proc.communicate()
    distance=len(out)
    data[sha1]=distance
answer=min(data.items(),key=operator.itemgetter(1))[0]
print('closest match: {s}'.format(s=answer))
subprocess.Popen(shlex.split('git checkout {h}'.format(h=head)),
                 stderr=open('/dev/null')).wait()

示例:

% rsync -a gitdir/ workdir/
% cd workdir
% git checkout HEAD~10
HEAD is now at b9fcebf... fix foo

% cd ..
% /bin/rm -rf workdir/.git
% find_closest_sha1.py gitdir workdir
closest match: b9fcebfb170785c19390ebb4a9076d11350ade79

关于git - 查找缺少 .git 目录的工作目录的 Git 修订版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7779369/

相关文章:

windows - 在 Windows gitlab runner 的 gitlab-ci 中使用外部 git-lfs 服务器?

python - 如何在pandas数据框+ python中的一列中查找<>之间的多个子字符串

Excel VBA - 在一系列日期上使用查找方法

svn - 获取远程仓库的修订号

mysql - 是否有任何数据库在其命令行界面上支持版本控制?

git - Visual Studio GIT 与本地/网络文件夹同步作为远程/来源

Gitlab 使用个人访问 token 自动推送

linux - 如何在 docker 容器中生成与主机用户具有相同所有者的文件

cakephp - CakePHP中如何显示登录用户的记录?

propset 设置的 svn 修订号不匹配