Установка бит выполнения Mercurial в Windows
Я работаю над репозиторием Mercurial, который проверяется на файловой системе Unix, такой как ext3 на некоторых машинах, и FAT32 на других.
В Subversion я могу установить свойство svn: executable, чтобы контролировать, должен ли файл быть помечен как исполняемый, когда выгружен на платформе, поддерживающей такой бит. Я могу сделать это независимо от платформы, на которой запущен SVN, или файловой системы, содержащей мою рабочую копию.
В Mercurial я могу chmod + x получить тот же эффект, если клон находится в файловой системе Unix. Но как я могу установить (или удалить) исполняемый бит в файле в файловой системе FAT?
Ответы
Ответ 1
Mercurial отслеживает бит выполнения как часть метаданных файла. Там нет способа явно установить его в mercurial, но он отслеживает изменения, сделанные chmod
в unix. Файлы, добавленные в Windows, будут иметь бит выполнения, установленный по умолчанию, но команда атрибутов windows не позволяет вам устанавливать их.
Если вы выполните hg log -p --git
, вы увидите формат патча, который показывает изменение бит выполнения, который выглядит следующим образом:
$ 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
Если вы не можете перейти к системе unix, чтобы установить их, вы, вероятно, могли бы подделать такой патч и hg import
, но это определенно не оптимально.
Ответ 2
Пока вы не можете изменить бит выполнения, если файловая система не поддерживает его (я планирую его поддерживать в будущем).
Ответ 3
Для Windows вам необходимо создать файл патча, а затем применить его, например Ry4an сказал, но с аргументом --bypass
до hg import
. Это можно сделать, создав файл Powershell script с именем SetFileExecutable.ps1
с текстом ниже внутри него
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"
}
выполните его следующим образом:
.\SetFileExecutable.ps1" -comment "Marking file as executable" -fileRelativePath mvnw -repositoryRoot "c:\myrepo"
Использует решение, предоставляемое Мэтт Харбисон в Mercurial Bugzilla