使用Windows上的Git将符号链接文件添加为文件

时间:2015-06-03 09:57:27

标签: windows git symlink

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

但符号链接不会添加git:

  

(错误:readlink(" X.cs"):功能未实现)

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

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

5 个答案:

答案 0 :(得分:15)

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

[core]
    symlinks = false

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

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

与git 2.8或更高版本相同(我没有检查小于2.8的版本)

答案 1 :(得分:7)

  

目前的答案已过时,需要根据最近的修改进行修订   那里给出的解决方案还不够,而且无法正常工作。

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

  
    

在MinGW的Windows上运行时,通过ln创建符号链接始终失败     使用mklink代替ln是在Windows上创建链接的推荐方法

  

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

  

对于我的设置,即Windows 8.1上安装的Git for Windows 2.11.0 export MSYS=winsymlinks:nativestrict 可以解决此问题:git-for-windows/pull/156

     

以管理员身份启动Git Bash shell非常重要,只有管理员可以创建符号链接。因此,为了使tar -xf工作并创建所需的符号链接:

     
      
  • 以管理员身份运行Git Bash shell
  •   
  • 运行export MSYS=winsymlinks:nativestrict
  •   
  • 运行tar
  •   

另请参阅" Git Symlinks in Windows",现在安装程序(适用于Windows 2.10+的Git)包含符号链接支持:

symlink supoprt

您需要在克隆期间指定:

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

您的CMD会话需要以管理员身份运行。

毋庸置疑,对Windows用户施加先决条件是不行的(企业中的Windows通常具有有限的权限或没有权限提升)

然而,PR 156确实代表了一些Windows对符号链接的支持,released in Git For Windows 2.10 (Sept. 2016)

它告诉我git worktree最终实现了多个工作树引用... 而不是依赖于符号链接,并使借方和借方相互了解。

  

完成链接的工作树后,您只需将其删除即可。   存储库中工作树的管理文件最终将自动删除(请参阅git config中的gc.pruneworktreesexpire),或者您可以在主要或任何链接的工作树中运行git worktree prune来清理任何陈旧的管理文件。

那里没有象征性的联系。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

见下文。

  

P:\ denemeler \ gitdeneme1&gt; mklink / d linkDirectory P:\ puzzles

     

创建的符号链接:linkDirectory&lt;&lt; ===&gt;&gt;警:\拼图

     

P:\ denemeler \ gitdeneme1&gt; git status   在分支主文件Untracked文件:
  (使用“git add ...”包含将要提交的内容)

    linkDirectory/
     

没有添加到提交但未跟踪的文件存在(使用“git add”到   轨道)

     

P:\ denemeler \ gitdeneme1&gt; git add linkDirectory

     

P:\ denemeler \ gitdeneme1&gt; git status

     

在分支主机上更改为   承诺:(使用“git reset HEAD ...”取消暂停)

    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&gt; git commit -m“新文件”

     

[master 0c7d126] new   文件4个文件已更改,14150个插入(+)创建模式100644   linkDirectory / Juggle Fest Question.txt创建模式100644   linkDirectory / jugglefest.txt创建模式100644   linkDirectory / triangle.txt创建模式100644   linkDirectory / triangleQuestion.txt

     

P:\ denemeler \ gitdeneme1&gt; echo“aa”&gt;号码:\拼图\ newFile.txt

     

P:\ denemeler \ gitdeneme1&gt; git status

     

On branch master Untracked files:
  (使用“git add ...”包含将要提交的内容)

    linkDirectory/newFile.txt
     

没有添加到提交但未跟踪的文件存在(使用“git add”到   轨道)

答案 4 :(得分:0)

看起来所有的simlink都位于一个ntfs分区中,如果是真的,你可以将所有simlink更新为硬链接,通过一些脚本命令,mklink / h ...... 适用于任何CVS的硬链接。