在git中实现符号链接并实现跨平台同步
需求是这样的:希望在一个git
仓库内,将一些文件映射到不同的地方,确保相同格式的相对路径访问并同时确保文件的一致性。
例如,一个包含大量markdown
文档碎片的仓库,我们希望这些碎片被组合起来之后可以直接显示其中的图片,但碎片必须按特定文件夹组织,但我们并不想将图片们也分散放置(那样组合文档碎片的时候也必须同时组合附件文件夹),也不想将相同的文件复制到几个地方。
如果使用符号链接,就可以在每一个存放markdown文件的地方,都放置一个media
目录,在根目录是真实文件,在其他目录是符号链接,用符号链接指向唯一的那个真实目录。
如此一来,所有的markdown文件中的图片源链接都是一样的,也就是类似这样:
.
这就保证了所有文件可以到处相互替换和组合,同时可以原位带预览编辑。
前提
首先,如果是Windows,必须与Vista以上的版本。在新建符号链接时必须使用管理员权限打开终端——我知道/J
符号链接是不要管理员权限的,但git中你应该想用的/D
。
使用的步骤同样也是“创建-add
-提交”三部曲,在Linux下其实一切都很自然(注意用相对路径),坑主要出在Windows和跨平台中。
如果需要新增链接,在Linux下这样执行:ln -s ../../media media
,第二个media
是需要新建的链接的名字,第一个则是相对路径,注意要用/
.
在Windows下,则需要开一个管理员权限的cmd
(powershell
中没有mklink
命令,需要其他写法),然后:mklink /d media ..\..\media
,注意需要是/d
,因为git
自己创建的就是/d
,然后链接文件和目标路径的顺序与Linux是相反的,同时必须用\
.
要查看Windows下符号链接的分类,可以在
cmd
下执行dir /al /s
,看<SYMLINKD>
就知道了。
如上操作之后,没问题的话直接add
-commit
即可。注意创建之后git status
可能不会显示链接一类的信息,或者显示为../../media
一类的信息,用就行了。
如果是已经有远程仓库或者源仓库,需要克隆,在Linux下,可以直接克隆。在Windows下,则需要这样:
git clone -c core.symlinks=true git@git.srmcad.com:weiran/RepeatedReports.git repeatedReports
有资料说git config --global core.symlinks true
可以全局开启core.symlinks
功能,但测试之后发现克隆时不加-c core.symlinks=true
的话还是报错,猜测是因为安装Git for Windows
的时候没勾选“启用符号链接”选项,但是不想重新安装测试了。