无法将丢失的文件添加到VS2015 VSO Git

时间:2015-09-16 13:33:47

标签: git visual-studio github mean-stack

我已经手动(即不通过Bower)将一些公共lib文件添加到MEAN项目中。我当地的Git回购公司很高兴他们是新手(见附图)。但是,当我尝试“提交”时,或者'提交和推送'我收到错误消息'没有变化;什么都没有提交':

enter image description here

发生了什么?如何将这些新文件强制进入共享仓库,以便其他开发人员可以将它们拉出来?

1 个答案:

答案 0 :(得分:1)

检查您的.gitignore文件。

Visual Studio有时会对“包含的更改”部分中显示的内容感到困惑,因为它不仅仅依赖于git所说的内容。我相信它监视文件系统的变化(但请参见下面的注释)),我认为它也可能会挂钩Visual Studio引发的事件,告诉源控制提供者有关更改的信息(回过头来看,曾经是唯一的一种变化)源控制提供商会注意到。)

这可能会导致各种问题。一个是VS可能没有意识到git会决定一个文件真的不需要处理 - 例如,因为它不会像git那样看起来与它不同以前的版本(和行结尾可能会使问题复杂化),或者显然,就像在这种情况下,因为它在.gitignore中。通常情况下,VS确实尊重.gitignore,但有些情况并非如此。例如,我认为如果VS在.gitignore中没有列出该文件的情况下添加该文件,那么在您告诉git忽略它之后,它就可以保留在列表中。

还有一些微妙的问题也可能出现 - 当你移动或重命名文件时,Visual Studio可以从git中形成与真实情况不同的意见。 (例如,VS可能已经通知VS git提供程序已重命名某个特定文件,但git没有该历史记录,如果该文件已经发生了足够的变化,它可能会认为它实际上是新的文件)。

作为一般规则,在命令行运行git status以查看git的真实想法。这将报告明确的事实 - 如果git没有在此处列出改变的内容,那么VS报告的内容并不重要。

注意:(在编辑2015/11/30中添加)。在评论中,Edward Thomson说" VS并不简单地根据文件系统活动将路径放入列表中,它会重新计算git状态。"所以也许我对VS为什么有时会出现令人困惑的事情的解释是错误的。然后,它不能(正如爱德华所说的那样)"重新计算git状态"因为VS经常会从git中得到一个不同的答案。 (毕竟,这就是克里斯首先提出他的问题的原因。)

另外,Edward Thomson说,"在创建文件之前,你必须有一个.gitignore(就像使用git add一样。)"但至少有一个合理的定义"创建文件",事实并非如此。 E.g:

PS C:\temp\gittest> git init
Initialized empty Git repository in C:/temp/gittest/.git/
PS C:\temp\gittest> notepad Test.foo

如果键入一些文本并将文件保存在记事本中,那么我已经创建了文件"在此刻。以下是git如何看待它:

PS C:\temp\gittest> git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Test.foo

nothing added to commit but untracked files present (use "git add" to track)

已创建,但未添加。 (就git而言,有两个不同的东西。)现在我要继续创建一个.gitignore:

PS C:\temp\gittest> notepad .gitignore

我输入*.foo并保存文件,然后在命令行继续,首先验证我的.gitignore包含我认为它的作用:

PS C:\temp\gittest> type .\.gitignore
*.foo
PS C:\temp\gittest> git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitignore

nothing added to commit but untracked files present (use "git add" to track)
PS C:\temp\gittest>

正如您所看到的,我最初没有.gitignore,所以第一次运行git status时,它报告我的Test.foo文件未被跟踪(因此会添加如果我执行了git add .)但后来又添加了.gitignore,当我再次运行git status时,它已停止显示Test.foo,因为我新增了.gitignore告诉它。因此,我们认为与爱德华的陈述相反,在创建文件后创建.gitignore 绝对没问题。

我认为这样做的核心是爱德华将创建文件并将其添加到git的索引中。他写了短语&#34;创建文件(就像使用git add。)&#34;但这些并不相同 - 创建文件与使用git add是截然不同的。对我来说(对于我认识的很多人,他们学会了谁在命令行上学习了git,并且随后与VS稍微挣扎)这是完全为什么VS的git集成可以有时候会如此令人惊讶。直接使用git,创建文件与告诉git对该文件执行某些操作是完全不同的单独步骤。 Git将新创建的文件显示为“未跟踪”,并且只有git add它们才会开始正确关注它们。 (当然,实际提交文件是另一个单独的步骤。)

我一开始觉得很困惑的是,VS的git支持看起来就像它做出了同样的区别:你有&#34;未跟踪文件&#34; &#34;包含的变更&#34;和实际的提交。 VS&#34; Untracked File&#34;的概念并不是很明显。并不像git那样 - 所有VS在&#34; Included Changes&#34;仍显示为&#34;未跟踪的文件&#34;在git中(或者,在Chris的情况下,由于.gitignore,它根本不会出现。)在git中,你可以从&#34; Untracked&#34; &#34;在git的职权范围内但尚未承诺&#34;状态为git add。相反,VS决定文件是否应该在&#34; Included Changes&#34;中的机制。 vs&#34; Untracked Files&#34;对我来说是一个完全的谜。如果您将新文件添加到项目中,它们最终会进入&#34;包含的更改&#34;但偶尔会进入&#34; Untracked Files&#34;没有明显的原因。

使得&#34;包含的变化&#34;对git命令行用户来说特别困惑的是,VS似乎将.gitignore的规则应用于那些文件,就像你已经添加了文件一样,但是实际上并没有添加文件。而这正是克里斯在他的问题中遇到的情况:VS认为有提交的更改(因为它正在处理包含的更改,好像git add已经为那些人做过)但是没有& #39; t(因为就git而言,这些都是未经跟踪的文件,因此它们都受.gitignore的约束。)

这使我认为VS必须监视文件系统的变化 - 在没有直接等同于我们在命令行执行的显式git add操作的情况下,我不知道它是如何知道特定文件是在.gitignore之前还是之后创建的,如果它没有观察文件系统。