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

标签 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,当项目包含来自“联合”目录的文件时,Team Explorer 的行为会非常奇怪:

  • 将位于目录交界处的文件添加到项目后,团队资源管理器只会在要提交的更改列表中显示其父目录(交界处),而不是文件本身。
  • 在提交所有更改(即文件已添加)后,解决方案资源管理器显示所有文件被跟踪和 checkin (包括那些驻留在路口和被添加后显示在待定更改列表中:

git1

  • 编辑显示为已 checkin 且驻留在联结目录中的文件将使它看起来像是已 checkout :

git2

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

git3

  • 然而,尝试提交失败并显示一条消息:“发生错误。详细消息:没有更改;没有要提交的内容。”

git4

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

git5

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

git6 git7

上面是用一个新的测试项目完成的,其中项目根目录中的 frame 目录实际上是一个连接点。

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

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

最佳答案

目前不支持。这是因为 Git for Windows 和 libgit2 之间的联结处理在解释上存在差异,libgit2 是 Visual Studio 和 TortoiseGit(的一部分)使用的 Git 库。

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

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

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

关于windows - 如何让 GIT 将目录连接视为 Windows 上的常规文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37930363/

相关文章:

css - 我如何在母版页中使用 js 文件?

c# - WindowsIdentity 缺失组 - 特别是管理员组

git - 如何配置 git 以在提交中包含我的名字

windows - 当我们传递用“(双引号)引用的参数时,批处理脚本出现问题

linux - 在服务器上删除重复的 Git 分支

git - 为什么.git 目录中不允许某些git 命令?

.net - 如何从引用的 .NET 程序集中重新导出类型

C#、xunit、fscheck,使用自定义生成器或约束随机字符串编写基于简单属性的测试

python - Windows 视频播放器无法播放 ffmpeg 中裁剪的视频

c++ - 如何将程序的句柄赋予它创建的进程?