Git Symlinks in Windows

前端 未结 13 1296
执念已碎
执念已碎 2020-11-22 09:23

Our developers use a mix of Windows and Unix based OS\'s. Therefore, symlinks created on Unix machines become a problem for Windows developers. In windows (msysgit), the sym

相关标签:
13条回答
  • 2020-11-22 09:35

    It ought to be implemented in msysgit, but there are two downsides:

    • Symbolic links are only available in Windows Vista and later (should not be an issue in 2011, and yet it is...), since older versions only support directory junctions.
    • (the big one) Microsoft considers symbolic links a security risk and so only administrators can create them by default. You'll need to elevate privileges of the git process or use fstool to change this behavior on every machine you work on.

    I did a quick search and there is work being actively done on this, see issue 224.

    0 讨论(0)
  • 2020-11-22 09:35

    I would suggest you don't use symlinks within the repo'. Store the actual content inside the repo' and then place symlinks out side the repo' that point to the content.

    So lets say you are using a repo' to compare hosting your site on *nix with hosting on win. Store the content in your repo', lets say /httpRepoContent and c:\httpRepoContent with this being the folder that is synced via GIT, SVN etc.

    Then, replace the content folder of you web server (/var/www and c:\program files\web server\www {names don't really matter, edit if you must}) with a symbolic link to the content in your repo'. The web servers will see the content as actually in the 'right' place, but you get to use your source control.

    However, if you need to use symlinks with in the repo', you will need to look into something like some sort of pre/post commit scripts. I know you can use them to do things, such as parse code files through a formatter for example, so it should be possible to convert the symlinks between platforms.

    if any one knows a good place to learn how to do these scripts for the common source controls, SVN GIT MG, then please do add a comment.

    0 讨论(0)
  • 2020-11-22 09:35

    Here is a batch script for converting symlinks in repository, for files only, based on Josh Lee's answer. Script with some additional check for administrator rights is at https://gist.github.com/Quazistax/8daf09080bf54b4c7641.

    @echo off
    pushd "%~dp0"
    setlocal EnableDelayedExpansion
    
    for /f "tokens=3,*" %%e in ('git ls-files -s ^| findstr /R /C:"^120000"') do (
         call :processFirstLine %%f
    )
    REM pause
    goto :eof
    
    :processFirstLine
    @echo.
    @echo FILE:    %1
    
    dir "%~f1" | find "<SYMLINK>" >NUL && (
      @echo FILE already is a symlink
      goto :eof
    )
    
    for /f "usebackq tokens=*" %%l in ("%~f1") do (
      @echo LINK TO: %%l
    
      del "%~f1"
      if not !ERRORLEVEL! == 0 (
        @echo FAILED: del
        goto :eof
      )
    
      setlocal
      call :expandRelative linkto "%1" "%%l"
      mklink "%~f1" "!linkto!"
      endlocal
      if not !ERRORLEVEL! == 0 (
        @echo FAILED: mklink
        @echo reverting deletion...
        git checkout -- "%~f1"
        goto :eof
      )
    
      git update-index --assume-unchanged "%1"
      if not !ERRORLEVEL! == 0 (
        @echo FAILED: git update-index --assume-unchanged
        goto :eof
      )
      @echo SUCCESS
      goto :eof
    )
    goto :eof
    
    :: param1 = result variable
    :: param2 = reference path from which relative will be resolved
    :: param3 = relative path
    :expandRelative
      pushd .
      cd "%~dp2"
      set %1=%~f3
      popd
    goto :eof
    
    0 讨论(0)
  • 2020-11-22 09:41

    2020 Answer

    1. Enable "Developer mode" in Windows 10 -- gives mklink permissions
    2. Ensure symlinks are enabled in git
      • git config --global core.symlinks true
      • or check the checkbox when installing msysgit

    Switching branches will force the recreation of missing symlinks.

    Be careful, support for Symlinks on Windows with some other Git clients is not complete. Notably GitKraken.

    0 讨论(0)
  • 2020-11-22 09:44

    Short answer: They are now supported nicely, if you can enable developer mode.

    From https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/

    Now in Windows 10 Creators Update, a user (with admin rights) can first enable Developer Mode, and then any user on the machine can run the mklink command without elevating a command-line console.

    What drove this change? The availability and use of symlinks is a big deal to modern developers:

    Many popular development tools like git and package managers like npm recognize and persist symlinks when creating repos or packages, respectively. When those repos or packages are then restored elsewhere, the symlinks are also restored, ensuring disk space (and the user’s time) isn’t wasted.

    Easy to overlook with all the other announcements of the "Creator's update", but if you enable Developer Mode, you can create symlinks without elevated privileges. You might have to re-install git and make sure symlink support is enabled, as it's not by default.

    0 讨论(0)
  • 2020-11-22 09:46

    The most recent version of git scm (testet 2.11.1) allows to enable symbolic links. But you have to clone the repository with the symlinks again git clone -c core.symlinks=true <URL>. You need to run this command with administrator rights. It is also possible to create symlinks on Windows with mklink. Check out the wiki.

    0 讨论(0)
提交回复
热议问题