anden3 icon

Fix Symlinks

anden3 | PRO | 06/22/17 12:35:44 PM UTC | 0 ⭐ | 390 👁️ | Never ⏰ | []
PowerShell |

1.72 KB

|

None

|

0 👍

/

0 👎

# Retrieve list of all indexed files in Templates folder.
$files = git ls-files -s Templates;
 
$fileCount = $files.Count;
$currentFileIndex = 0;
 
foreach ($file in $files) {
    $currentFileIndex++;
 
    # Extract file mode and path of file.
    $rgx = [regex]::match($file, '^(\d{6}) \w{40} \d+\t(.+)$').Groups;
 
    # Check if file mode indicates that this should be a symbolic link. If not, skip it.
    if ($rgx[1].Value -ne "120000") {
        continue;
    }
 
    # Resolve the path of the file.
    $destPath = Resolve-Path $rgx[2].Value;
 
    # Check if file is already a symlink, and if so skip it.
    if (Get-Item $destPath | Where-Object { $_.Attributes -match "ReparsePoint"} ) {
        continue;
    }
 
    # Get the target of the symlink.
    $relPath = Get-Content $destPath;
 
    # Combine the file path and the relative target path to get an absolute path to the target file.
    $source = Join-Path (Split-Path $destPath) $relPath -Resolve;
 
    # Move to the parent folder of the symlink.
    Push-Location (Split-Path $destPath);
 
    # Get a working relative path to the target.
    $relPath = Resolve-Path -Relative $relPath;
 
    # Delete the broken symlink.
    Remove-Item $destPath;
 
    # Create a new symlink.
    if (!(Get-Item $source).PSIsContainer) {
        cmd /q /c mklink "$($destPath)" "$($relPath)" | Out-Null;
    }
    else {
        cmd /q /c mklink /d "$($destPath)" "$($relPath)" | Out-Null;
    }
 
    # Return to previous working directory.
    Pop-Location;
 
    # Tell Git to ignore the file change.
    git update-index --assume-unchanged $destPath;
 
    # Show progress.
    Write-Host -NoNewline "$($currentFileIndex) out of $($fileCount) symlinks fixed.`r";
}

Comments