如何让GIT将目录连接视为Windows上的常规文件夹?

时间:2016-06-20 19:28:44

标签: windows git visual-studio version-control junction

我需要共享以在不同项目之间共享某些文件。因此我有一个像这样的文件结构:

D:\shared\
D:\shared\files-shared-by-all-projects-here

D:\project1\
D:\project1\project1-specific-files-here
D:\project1\shared <- directory junction to D:\shared

D:\project2\
D:\project2\project2-specific-files-here
D:\project2\shared <- directory junction to D:\shared

我在D:\project1D:\project2设置了GIT回购。我的问题是GIT似乎只跟踪非联结(即真实目录)中的文件。

我将Visual Studio 2015用于这两个项目,当项目包含来自&#34;联合的文件时,它的团队资源管理器会表现得非常奇怪。目录:

  • 将驻留在目录结点中的文件添加到项目后,团队资源管理器只会在要提交的更改列表中显示其父目录(联结),而不是文件本身。
  • 提交所有更改(即已添加文件)后,解决方案资源管理器会将所有文件显示为已跟踪且已签入(包括那些位于联结中的文件)添加完成后的待处理更改列表中显示

git1

  • 编辑显示为已签入并位于联结目录中的文件将使其显示为签出

git2

  • 现在返回团队资源管理器,已修改文件列表中显示的签出文件

git3

  • 但尝试提交它失败并显示一条消息:&#34;发生错误。详细信息:没有变化;没什么可承诺的。&#34;

git4

  • 返回解决方案资源管理器,但提交失败的已更改文件仍显示为已签入:

git5

使用Tortoise GIT显式添加驻留在共享目录中的文件(即通过D:\project2\shared\some-shared-file引用它)来自Visual Studio 的文件不起作用:添加失败并显示一条消息:它既是文件又是目录。

git6 git7

上面是一个新的测试项目,其中frame目录中的data目录实际上是一个交汇点。

在我的实际项目中,情况略有不同......例如,如果我使用Tortoise GIT浏览仓库,它实际上会显示位于交叉点的共享文件被跟踪和签入以及部分仓库。但是,只要我在Visual Studio中打开项目,它就会显示解决方案资源管理器中的相同文件和团队资源管理器更改为&#34;等待删除&#34;。这是一个VS quirck吗?

所以最重要的是我只想知道如何使文件驻留在目录连接中作为项目的一部分与常规文件相同,以便正确检出并重新检入并形成部分项目(回购)历史?

1 个答案:

答案 0 :(得分:3)

目前,这不受支持。这是由于Git for Windows和libgit2之间的联结处理之间的解释不同,libgit2是Visual Studio和(部分)TortoiseGit使用的Git库。

已决定两个实现应该 treat junction points as if they are Unix mount points,但目前实际上实现的实现都没有。

目前,Git for Windows将它们视为正常目录(因此它可能会删除您的联结并将其替换为新目录)。 libgit2将此视为符号链接,因此,Visual Studio根本不会处理它。

由于Microsoft需要更新Visual Studio以解决此问题,请在Microsoft Connect提交错误并鼓励人们投票支持它,希望它能在VS 2015中修复。