Git for Windows“No tags file”响应来自“git diff”命令

时间:2017-10-06 21:56:52

标签: windows git msbuild atlassian-sourcetree git-diff

Git版本:2.14.2.2

每当我在存储库上运行git diff时,我都会收到回复No tags file。我已经尝试在多个存储库,多个控制台(Cmd,PowerShell,MINGW64,Visual Studio命令提示符)上运行该命令,并且所有控制台都具有相同的响应。

No tags file

奇怪的是,git log命令也失败了。但是,许多其他命令都可以使用,例如git statusgit pull等。它似乎只有logdiff

Working commands

我完全卸载了Git并重新安装。重启我的系统。尝试直接引用git.exe(产生完全相同的响应)。没有什么工作,我没有在其他地方看到这个错误。我将用户配置与同事的配置进行了比较,但它们完全相同。

该命令的某些部分正确执行,因为如果我提供两个提交哈希,并且我故意破坏一个,我收到的响应是:

Bad Response

似乎另一个程序可能正在劫持git diff命令。我相信这是因为我不确定“没有标签文件”甚至是可能的Git响应。不确定它会是什么。

让事情变得更加混乱 - 我的最终目标是在git diff的上下文中运行msbuild并且它执行得非常正确。现在,我对此感到满意,但是我需要稍微修改diff命令,并且每次运行完整版本都没有效率,也不容易排除故障。构建脚本中有一个运行Exec命令的任务,执行diff时没有问题。我也能在SourceTree中执行Diff Against Current,据我所知,在幕后运行git diff

非常感谢任何帮助。

:: Edits ::

各种命令:

git diff HEAD~1 HEAD
git diff master~1 master
git diff <commit-hash-1> <commit-hash-2>
git log HEAD~1..HEAD
git log master~1..master
git log <commit-hash-1>..<commit-hash-2>

输出:

上述所有命令都会在我的所有回购中返回相同的No tags file响应。

猫头:

cd .git
cat HEAD
ls -R refs

输出:

CatHead

新回购:

mkdir testrepo
cd testrepo
git init
echo "file1" > file1.txt
git add .
git commit -m "initial commit of file1.txt"
echo "Hi there!" > file2.txt
git add .
git commit -m "added file2.txt"
git log
git diff HEAD~1 HEAD

输出:

NewRepo

git config -e:

gitconfige

git config --global -e:

gitconfigglobale

::编辑2 ::

我卸载了所有的差异/源代码控制工具(SourceTree,Git,SVN,WinMerge,KDiff)。安装了便携版Git。将CMD打开到repo,放入git.exe portable的完整路径,它仍然返回No tags file响应。

我还审查了我的所有路径变量:git,vim,ming,mintty以及其他任何看似可疑的东西,但没有找到。

我在执行所有步骤后重新启动,但问题仍然存在。

::编辑3 ::

我的笔记本电脑上有不同的用户,切换到该用户并且git diff正常工作,所以我的主要用户显然存在冲突。将继续查看我的User目录中的问题。

2 个答案:

答案 0 :(得分:3)

以下是我在这种情况下采取的步骤:

  1. 请尝试以下操作并检查回复:

    git diff HEAD~1 HEAD
    git diff master~1 master
    git diff <commit-hash-1> <commit-hash-2>
    
  2. 尝试使用log:

    git log HEAD~1..HEAD
    git log master~1..master
    git log <commit-hash-1>..<commit-hash-2>
    

    我实际上是猜测你的参考文章搞砸了,这意味着直接哈希可能会有效,但HEAD和/或master可能没有。

  3. 查看.git/refs文件夹

    从主repo文件夹:

    cd .git
    cat HEAD
    ls -R refs
    

    希望HEAD指向分支,如果master已签出,则cat HEAD输出应如下所示:

    ref: refs/heads/master
    

    然后,ls -R refs应显示heads文件夹,其中包含每个本地分支的文件(即master和其他可能的其他分支)。您也可能有refs/remotesrefs/tags个目录。

    如果这些事情中的任何一个完全不同或缺失,那可能是你的问题......

  4. 由于您已重新安装git,请创建一个全新的repo并尝试相同的命令:

    mkdir testrepo
    cd testrepo
    git init
    echo "file1" > file1.txt
    git add .
    git commit -m "initial commit of file1.txt"
    echo "Hi there!" > file2.txt
    git add .
    git commit -m "added file2.txt"
    git log
    git diff HEAD~1 HEAD
    

    如果这最后一个有效,那么git可能正常工作,但是你有一些工具搞乱了。

  5. git config -egit config --global -e发布您的配置 - 也许我们可以看到一些内容?

答案 1 :(得分:3)

在Google上搜索“无标记文件”消息时,第一个结果是我所有人都在讨论vi

我不明白为什么git在运行vigit diff时尝试执行git log,可能是您的系统配置为使用vi作为寻呼机?

# some possible places which could influence that :
echo $PAGER
echo $GIT_PAGER
git config --get core.pager

在深入了解less的文档时,我发现less可以使用ctags文件来查找“包含此标记的文件”。

因此,您还可以查看影响less行为的变量列表:

# from bash :

# env will list all the defined environment variables
env

# the ones that impact 'less' should contain "LESS" in their names :
env | grep LESS