git diff--显示不存在文件的名称状态

git diff--显示不存在文件的名称状态,git,Git,我尝试在Azure DevOps管道中压缩和部署通过Git列出的文件。我遇到的问题是,我使用以下命令列出要部署的文件,即使是在以前的提交中也是如此,因为交付并不总是在同一时间完成: git diff --name-only --diff-filter=d 但是我发现有一个文件已经被列在一个不再存在的文件夹中,而使用git日志,我也没有找到该文件的任何痕迹 奇怪的是,该文件以奇怪的方式出现在命令的输出中,双引号被称为“Modified”: PS:抱歉,缺少的信息是带有双引号的行\303\252

我尝试在Azure DevOps管道中压缩和部署通过Git列出的文件。我遇到的问题是,我使用以下命令列出要部署的文件,即使是在以前的提交中也是如此,因为交付并不总是在同一时间完成:

git diff --name-only --diff-filter=d
但是我发现有一个文件已经被列在一个不再存在的文件夹中,而使用git日志,我也没有找到该文件的任何痕迹

奇怪的是,该文件以奇怪的方式出现在命令的输出中,双引号被称为“Modified”:

PS:抱歉,缺少的信息是带有双引号的行\303\252是导致我出现问题的行。我使用git diff--name status--diff filter=d命令生成了输出,事实上\303\252是ansi 1252和UTF8(Suivi_Entête_cr_old.asp)之间的编码转换引起的问题。

我不明白git日志没有给我答案,而且这个文件是一个修改过的文件,但不存在。我怀疑该文件夹已被删除,但何时删除? 我找不到正确详细的答案

PS2:使用命令git-c core.quotepath=false——无寻呼机差异——仅名称: Appli_web_livre/credits_invendus/Suivi_Ent??te_cr_old.asp

PS3:如果控制台powershell使用ASCII编码,我有??更换ê,但将控制台更改为UTF8:

[控制台]::outputeneCoding=[系统.文本.编码]::UTF8)
我获得了正确的字符串。

复制

我不明白git日志没有给我答案,而且这个文件是一个修改过的文件,但不存在。我怀疑该文件夹已被删除,但何时删除

从重要的意义上讲,Git实际上并不存储文件夹。它存储操作系统要求切碎的长名称文件,例如
Appli\u web\u livre/credits\u invendus/CR\u ajout\u article.asp
。这就是一个文件的名称:它不是一个文件夹,一个文件夹,一个文件,它只是一个名称。是您的操作系统要求Git首先创建一个文件夹
Appli\u web\u livre
,以此类推

Git处理这个问题的方式是,每当它需要创建一个名为(比如)Appli_web_livre/credits_invendus/CR_ajout_article.asp的工作树文件时,它都会在一个文件夹
Appli_web_livre
中创建一个文件夹
credits_invendus
,这样操作系统就会很高兴。这有时确实会导致问题,例如当您有一个名为
Appli\u web\u livre
的文件时。(Git中的内部代码正在构建操作系统操作,以执行
Git签出
Git重置
或类似操作,将其称为“D/F冲突”:需要文件的目录,反之亦然。)

这一问题有多种原因,包括:

我找不到正确详细的答案

您提到的
git diff
命令:

通常比较两个提交。(有很多例外,但由于您提到了AzureOps管道,我猜您在这里使用的是这种模式。)要实现这一点,您必须指定两个提交:

git diff <commit1> <commit2>
例如,将打印任何
A
dded和
D
eleted文件,但忽略修改后的文件或带有任何其他字母代码的文件。另一方面,小写表示排除此类型,因此:

表示排除
D
文件,即打印
A
dded、
M
modified、
R
enamed或
T
ype-changed文件,但不排除
D
eleted文件。3此处的状态为
M
,该部分正常

这意味着两个输入提交都包含一个名为
Appli\u web\u livre/credits\u invendus/CR\u ajout\u article.asp的文件,并且这些文件的两个副本不同。在不知道输入提交是什么的情况下,我们对此没有什么可说的了


1
-R
标志反转侧面。这种形式的diff不需要这样做,因为您可以反转这两个参数,但是一些
git diff
操作使用您的工作树内容、索引内容或隐含的
HEAD
,对于这些操作,
-R
标志特别方便,甚至是必要的

2当启用“查找重命名”选项时,左侧的已删除文件可以与右侧的新创建文件配对。这种配对然后告诉
git diff
声明这些文件,尽管名称发生了变化,但它们是同一个文件,就像一个副本实际上可能是忒修斯的飞船一样。然而,在这种情况下,这并没有发生

3全套可能的字母列为ABCDMRTUX。状态代码
B
仅在使用
-B
选项并指示配对已断开时才可能出现,但我从未能够在任何测试中将其显示出来。状态码<代码> u >代码>只能发生在不完整的中间。状态代码
C
仅在启用了
--查找副本时才会出现。状态代码
X
表示差异代码中存在错误,因此不应发生。实际上,您的
git diff
应该只生成A、C、D、M、R或T;只有在启用了复制和/或重命名检测时,才会出现C和R。由于
git diff
遵循用户配置,这将取决于您的用户配置

由于
git diff
遵循用户配置,脚本应该很少使用
git diff
本身,而是应该调用一个更具体的管道命令,例如
git diff tree


其他细节 我发现有一个文件被列为一个不再存在的文件夹,而使用git日志,我也没有找到该文件的任何痕迹

您不会显示您在git日志中使用的命令git diff <commit1> <commit2>
--diff-filter=AD
--diff-filter=d
git log Appli_web_livre/credits_invendus/CR_ajout_article.asp