mac hard for exfat and windows mercurial cross-platform filesystems fat32

hard - Configurando el bit de ejecución de Mercurial en Windows



hard drive mac and windows (3)

Trabajo en un repositorio de Mercurial que se revisa en un sistema de archivos Unix como ext3 en algunas máquinas y FAT32 en otras.

En Subversion, puedo configurar la propiedad svn: executable para controlar si un archivo debe marcarse como ejecutable cuando se desprotege en una plataforma que admite dicho bit. Puedo hacer esto independientemente de la plataforma en la que ejecuto SVN o del sistema de archivos que contiene mi copia de trabajo.

En Mercurial, puedo chmod + x para obtener el mismo efecto si el clon está en un sistema de archivos Unix. Pero, ¿cómo puedo establecer (o eliminar) el bit ejecutable en un archivo en un sistema de archivos FAT?


Por el momento, no puede cambiar el bit de ejecución si el sistema de archivos no lo admite (tengo la intención de admitirlo en el futuro).


Mercurial rastrea el bit de ejecución como parte de la metadata del archivo. No hay forma de configurar explícitamente mercurial, pero rastrea los cambios realizados por chmod en Unix. Los archivos agregados en Windows tendrán el bit de ejecución establecido de manera predeterminada, pero el comando attrib de Windows no permite configurarlos.

Si haces un hg log -p --git , verás el formato de parche que muestra la alteración del bit de ejecución, que se ve así:

$ hg log --git -p changeset: 1:0d9a70aadc0a tag: tip user: Ry4an Brase <[email protected]> date: Sat Apr 24 10:05:23 2010 -0500 summary: added execute diff --git a/that b/that old mode 100644 new mode 100755 changeset: 0:06e25cb66089 user: Ry4an Brase <[email protected]> date: Sat Apr 24 10:05:09 2010 -0500 summary: added no execute diff --git a/that b/that new file mode 100644 --- /dev/null +++ b/that @@ -0,0 +1,1 @@ +this

Si no puede acceder a un sistema Unix para configurarlos, probablemente podría falsificar un parche como ese y hacerlo, pero eso definitivamente no es óptimo.


Para Windows necesita crear un archivo de parche y luego aplicarlo, como dijo Ry4an , pero con el argumento --bypass para hg import . Esto se puede hacer creando un archivo de script Powershell llamado SetFileExecutable.ps1 con el texto debajo dentro de él

param ( [String]$comment = "+execbit", [Parameter(Mandatory=$true)][string]$filePathRelativeTo, [Parameter(Mandatory=$true)][string]$repositoryRoot ) if( Test-Path -Path "$($repositoryRoot)/.hg" -PathType Container ) { if( Test-Path -Path "$($repositoryRoot)/$($filePathRelativeTo)" -PathType Leaf ) { $fileRelativePath = $fileRelativePath.Replace( ''/', ''/'' ) $diff = "$comment" + [System.Environment]::NewLine + [System.Environment]::NewLine + "diff --git a/$fileRelativePath b/$fileRelativePath" + [System.Environment]::NewLine + "old mode 100644" + [System.Environment]::NewLine + "new mode 100755" Push-Location cd $repositoryRoot $diff | Out-File -Encoding ''utf8'' $env:tmp/exebit.diff hg import --bypass -m "$comment" $env:tmp/exebit.diff Pop-Location } else { Write-Host "filePathRelativeTo must the location of a file relative to repositoryRoot" } } else { Write-Host "repositoryRoot must be the location of the .hg folder" }

ejecutarlo de la siguiente manera:

./SetFileExecutable.ps1" -comment "Marking file as executable" -fileRelativePath mvnw -repositoryRoot "c:/myrepo"

Utiliza la solución proporcionada por Matt Harbison en Mercurial''s Bugzilla