我在git中有一个很大的(超过1000个文件)VS C#项目。我需要创建一个小型演示项目并使用大项目中的十个文件。为了创建这个新项目,我从大项目中添加了10个带有mklink(符号链接)的文件到小项目。大项目和小项目中相应文件的所有更改都是相同的。现在我需要将小项目添加到另一个(我自己的)git仓库。
但符号链接不会添加git:
(错误:readlink(" X.cs"):功能未实现)
如何将git中的X.cs(符号链接)文件作为常规文件添加?
我需要将X.cs中的所有更改(在大项目中)移动到X.cs(小项目)。
答案 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)包含符号链接支持:
您需要在克隆期间指定:
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的硬链接。