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