2010-04-24 8 views
11

Ich arbeite an einem Mercurial-Repository, das auf einigen Unix-Dateisystemen wie ext3 ausgecheckt ist, und auf anderen mit FAT32.Einstellung von Mercurials Ausführungsbit unter Windows

In Subversion kann ich die svn: executable-Eigenschaft festlegen, um zu steuern, ob eine Datei als ausführbar markiert werden soll, wenn sie auf einer Plattform ausgecheckt wird, die ein solches Bit unterstützt. Ich kann dies unabhängig von der Plattform, auf der ich SVN aktiviere, oder dem Dateisystem, das meine Arbeitskopie enthält.

In Mercurial kann ich chmod + x, um den gleichen Effekt zu erhalten, wenn der Klon auf einem Unix-Dateisystem ist. Aber wie kann ich das ausführbare Bit in einer Datei auf einem FAT-Dateisystem setzen (oder entfernen)?

Antwort

8

Mercurial verfolgt das Ausführungsbit als Teil der Datei metdata. Es gibt keine Möglichkeit, es explizit in mercurial zu setzen, aber es verfolgt Änderungen, die von chmod auf Unix gemacht werden. Bei Dateien, die in Windows hinzugefügt werden, wird standardmäßig das Ausführungsbit gesetzt, aber der Windows-Befehl attrib erlaubt es nicht, sie zu setzen.

Wenn Sie das tun ein hg log -p --git Sie den Patch-Format sehen, die das Ändern des Execute-Bit zeigt, die wie folgt aussieht:

$ 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 

Wenn Sie auf einem Unix-System sind nicht in der Lage zu bekommen auf um sie zu setzen, könntest du wahrscheinlich einen solchen Patch fälschen und hg import es, aber das ist definitiv suboptimal.

+0

Ich habe versucht, diese Technik beim Hinzufügen einer Datei und es hat nicht funktioniert. Ich habe die Datei hinzugefügt, den Patch erstellt, den Repo zurückgesetzt, die Datei entfernt, den Patch bearbeitet, der 0644 durch 0755 ersetzt, und den Patch importiert. Beim Ziehen an einem Unix-System ist der Modus immer noch 0644. Mercurial 1.9.1. –

+0

Der Pull erstellt nicht die Datei, das Update tut. Nachdem du gezogen hast und du ein 'hg log --git -p' machst siehst du die 100755 im Patch? Wenn Sie dieses Execute-Bit aktualisieren, kann es sein, dass es zurückgesetzt wird, wenn die Umask es verbietet, das Dateisystem No-Execute eingehängt ist oder ein paar andere unwahrscheinliche Dinge. –

+0

Wenn Sie sich das Protokoll ansehen, wird der 0644-Modus angezeigt. Aus irgendeinem Grund hat er den Modus aus dem bearbeiteten Patch nicht akzeptiert. –

9

Zur Zeit können Sie das Execute-Bit nicht ändern, wenn das Dateisystem es nicht unterstützt (ich habe vor, es in Zukunft zu unterstützen).

+0

Jeder Status versehen verwendet auf diese Pläne? –

+0

Entschuldigung, ich hatte keine Zeit, daran zu arbeiten. – tonfa

+2

Filed eine Feature-Anfrage: http://bz.selenic.com/show_bug.cgi?id=3659 –

1

Für Windows müssen Sie eine Patch-Datei erstellen und dann wie Ry4an has said, aber mit dem --bypass Argument auf hg import anwenden. Dies könnte durch die Schaffung einer Powershell-Skriptdatei namens erfolgen SetFileExecutable.ps1 mit dem Text im Inneren

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" 
} 

es wie folgt ausführen:

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

Die die Lösung von Matt Harbison in Mercurial's Bugzilla