在 Windows 上使用 Git 添加符号链接文件作为文件

Add symlink file as file using Git on Windows

我在 git 中有一个很大的(超过 1000 个文件)VS C# 项目。我需要创建一个小型演示项目并使用大型项目​​中的十个文件。为了创建这个新项目,我从大项目到小项目添加了十个带有 mklink(符号链接)的文件。大小工程中对应文件的所有改动都是一样的。现在我需要将这个小项目添加到另一个(我自己的)git 存储库中。

但符号链接不会添加 git :

(error: readlink("X.cs"): Function not implemented)

如何将 X.cs(符号链接)文件添加到 git 中作为常规文件?

我需要将 X.cs(大项目)中的所有更改移至 X.cs(小项目)。

Git 在 Windows 上的符号链接确实有问题。但是,我认为您甚至不需要符号链接来解决您的问题。一个简单的解决方法是编写一个小的 *.bat 脚本,根据需要将有问题的文件从一个存储库复制到另一个存储库。使用符号链接,您不需要 运行 脚本,这可以节省您几秒钟的时间,但是您会遇到一个问题,即您可能会不小心更改小存储库中的文件并在大存储库中进行不需要的修改。

git 对单个文件 links 有问题,但对目录符号 links(mklink /d ) 没有问题。因此,将您的图像文件移动到您的大项目中的另一个目录,并在您的 git 存储库中创建目录 link 到该目录。

示例见下文。

P:\denemeler\gitdeneme1>mklink /d linkDirectory P:\puzzles

Created symbolic link : linkDirectory <<===>> P:\puzzles

P:\denemeler\gitdeneme1>git status On branch master Untracked files:
(use "git add ..." to include in what will be committed)

    linkDirectory/

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

P:\denemeler\gitdeneme1>git add linkDirectory

P:\denemeler\gitdeneme1>git status

On branch master Changes to be committed: (use "git reset HEAD ..." to unstage)

    new file:   linkDirectory/Juggle Fest Question.txt
    new file:   linkDirectory/jugglefest.txt
    new file:   linkDirectory/triangle.txt
    new file:   linkDirectory/triangleQuestion.txt

P:\denemeler\gitdeneme1>git commit -m "new files"

[master 0c7d126] new files 4 files changed, 14150 insertions(+) create mode 100644 linkDirectory/Juggle Fest Question.txt create mode 100644 linkDirectory/jugglefest.txt create mode 100644 linkDirectory/triangle.txt create mode 100644 linkDirectory/triangleQuestion.txt

P:\denemeler\gitdeneme1>echo "aa" > p:\puzzles\newFile.txt

P:\denemeler\gitdeneme1>git status

On branch master Untracked files:
(use "git add ..." to include in what will be committed)

    linkDirectory/newFile.txt

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

看起来你所有的模拟链接都位于一个 ntfs 分区中,如果是这样,你可以将所有模拟链接更新为硬链接,通过一些带有命令的脚本,mklink /h ... 对任何 CVS 都友好的硬链接。

如果向索引添加符号链接失败并出现错误 error: readlink("..."): Function not implemented,请尝试在本地或全局配置中查找此行:

[core]
    symlinks = false

您需要设置symlinks = true才能成功推送。 默认值 (=true) 如果参数不存在或不能正常工作,这取决于创建存储库的设置。

硬链接不适用于 GIT,因为文件和硬链接存储为单独的文件。

与git 2.8及以上版本相同(2.8以下版本我没检查)

The current answer(s) are out-of-date and require revision given recent changes.
The solutions given there isn't enough and isn't working.

Windows 上的最新 Git 2.12 仍然存在问题(2017 年 2 月,OP 问题 18 个月后)

在 2015 年所谓的 git-new-workdir 工作的背景下(能力,形成一个克隆,有多个工作树:这最终是 being called git worktree),Git 开发人员询问如何从主要克隆的存储库中引用这些工作树。
他们会使用 ln 吗?或其 Windows 等价物 mklink?

This thread, at the time, highlighted the issues:

When running on Windows in MinGW, creating symbolic links via ln always failed.
Using mklink instead of ln is the recommended method of creating links on Windows

这可能是正确的,但并不理想:“Git Bash Shell fails to create symbolic links”确实提到:

For my setup, that is Git for Windows 2.11.0 installed on Windows 8.1 export MSYS=winsymlinks:nativestrict does the trick as explained here: git-for-windows/pull/156

It's important to launch the Git Bash shell as administrator as on Windows only administrators could create the symbolic links. So, in order to make tar -xf work and create the required symlinks:

  • Run Git Bash shell as an administrator
  • Run export MSYS=winsymlinks:nativestrict
  • Run tar

另请参阅“Git Symlinks in Windows”,其中现在的设置(Git for Windows 2.10+)包括 symlink 支持:

您需要在克隆过程中指定:

git clone -c core.symlinks=true <URL> 

并且您的 CMD 会话需要 运行 作为管理员。

不用说 Windows 用户的先决条件是 no-go(Windows 在企业中通常具有有限的或没有特权提升)

然而,PR 156 does represent some Windows support for symlink, released in Git For Windows 2.10 (Sept. 2016).


这表明 git worktree 最终实现了多工作树引用...通过 而不是 依赖于符号 link 并使借款人和借款人相互了解。

When you are done with a linked working tree you can simply delete it. The working tree's administrative files in the repository will eventually be removed automatically (see gc.pruneworktreesexpire in git config), or you can run git worktree prune in the main or any linked working tree to clean up any stale administrative files.

所以那里没有符号 link。