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

Fit*_*Dev 5 windows git version-control visual-studio 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
Run Code Online (Sandbox Code Playgroud)

我已经设置了 GIT 存储库D:\project1D:\project2我的问题是 GIT 似乎只跟踪非连接(即真实目录)中的文件。

我对两个项目都使用 Visual Studio 2015,当项目具有来自“连接”目录的文件时,它的团队资源管理器的行为会非常奇怪:

  • 将驻留在目录连接中的文件添加到项目后,团队资源管理器将仅在要提交的更改列表中显示其父目录(连接),而不是文件本身。
  • 提交所有更改(即已添加文件)后,解决方案资源管理器将所有文件显示为正在跟踪和签入(包括那些驻留在联结中且在添加后显示在挂起更改列表中的文件:

git1

  • 编辑显示为已签入并驻留在联结目录中的文件将使其看起来已签出

git2

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

git3

  • 但是,尝试提交失败并显示一条消息:“发生错误。详细消息:无更改;没有任何可提交的内容。”

git4

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

git5

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

git6 git7

以上是通过一个新的测试项目完成的,其中frame驻留在项目根目录中的目录实际上是一个结点。

然而,在我的实际项目中,情况略有不同......例如,如果我使用 Tortoise GIT 浏览存储库,它实际上会将驻留在连接中的共享文件显示为被跟踪和签入以及存储库的一部分。但是,一旦我在 Visual Studio 中打开该项目,它就会将解决方案资源管理器和团队资源管理器更改中的相同文件显示为“待删除”。那么这是一个 VS 怪癖吗?

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

Edw*_*son 5

目前不支持此功能。这是由于 Windows 版 Git 和 libgit2 之间的连接处理之间的解释存在差异,libgit2 是 Visual Studio 和 TortoiseGit(部分)使用的 Git 库。

已经决定这两种实现都应该 将连接点视为 Unix 挂载点,但是目前这两种实现实际上都没有这样做。

目前,Windows 版 Git 将它们视为普通目录(因此它可能会删除您的连接并用新目录替换)。libgit2 将此视为符号链接,因此 Visual Studio 根本拒绝处理它。

由于 Microsoft 需要更新 Visual Studio 来修复此问题,因此请在Microsoft Connect上提交错误并鼓励人们投票,希望它能在 VS 2015 中得到修复。