2010-04-24 23 views
11

'da Mercurial'in yürütme bitini ayarlama Bazı makinelerde ext3 gibi bir Unix dosya sisteminde ve diğerlerinde FAT32 olarak kontrol edilen bir Mercurial depo üzerinde çalışıyorum.Windows

Subversion'da, svn: function özelliğini, bir dosyayı destekleyen bir platformda teslim alınırken yürütülebilir olarak işaretlenip işaretlenmeyeceğini denetlemek üzere ayarlayabilirim. SVN üzerinde çalıştığım platformdan veya çalışma kopyasını içeren dosya sisteminden bağımsız olarak bunu yapabilirim.

Mercurial'da, klon bir Unix dosya sisteminde bulunuyorsa aynı efekti elde etmek için chmod + x'i kullanabilirim. Ancak, FAT dosya sistemindeki bir dosyadaki yürütülebilir biti nasıl ayarlayabilirim (veya kaldırabilirim)?

cevap

8

Yürütme bitini, metdata dosyasının bir parçası olarak izler. Bunu açık bir şekilde satıcıya ayarlamanın bir yolu yok, ancak unix'te chmod tarafından yapılan değişiklikleri izler. Pencerelere eklenen dosyalar, yürütme bitinin varsayılan olarak ayarlanmış olmasına karşın, windows attrib komutu bunları ayarlamanıza izin vermez.

Bunu yaparsanız bir hg log -p --git şuna benzeyen yürütmek bitin değişikliklerin yapılmasını gösteren yama biçimi, göreceksiniz: Bir unix sistemine almak mümkün değilseniz

$ 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 

Bunları ayarlamak için, muhtemelen böyle bir yama ve hg import, ama kesinlikle sub optimal bu sahte olabilir.

+0

Bir dosya eklerken bu tekniği kullanmayı denedim ve işe yaramadı. Dosyayı ekledim, yamayı oluşturdum, repo'yu geri çevirdim, dosyayı sildim, 0644 yerine 0644'ü değiştiren yama düzenledim ve yamayı aldım. Bir Unix sistemi çekerken, mod hala 0644'tür. Mercurial 1.9.1. –

+0

Çekme dosyayı oluşturmuyor, güncelleme yapıyor. Çektikten ve bir "hg log --git -p" yaptıktan sonra 100755'i yamada görüyor musunuz? Umazk yasaklarsa, yürütme bitinin güncellenemediğini güncelleştirdiğinizde, dosya sistemi yürütme veya başka birkaç olası olmayan şeylere monte edilir. –

+0

Günlüğe bakarak, 0644 modunu gösterir, bu nedenle herhangi bir nedenden dolayı, düzenlenmiş yamadaki modu kabul etmedi. –

9

Dosya sistemi desteklemiyorsa, yürütme bitini değiştiremezsiniz (ileride desteklemeyi planlıyorum).

+0

Herhangi bir durum tarafından sağlanan çözümü kullanır bu planlar? –

+0

Üzgünüz, bunun üzerinde çalışmak için zamanım olmadı. – tonfa

+2

Bir özellik isteği dosyalandı: http://bz.selenic.com/show_bug.cgi?id=3659 –

1

Windows için bir yama dosyası oluşturmanız ve ardından Ry4an has said gibi birargümanı ile hg import argümanını uygulamanız gerekir. Bu bir PowerShell komut dosyası oluşturarak yapılabilir içeride aşağıda metin ile SetFileExecutable.ps1 denilen o

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

aşağıdaki gibi yürütün:

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

üzerinde Matt Harbison in Mercurial's Bugzilla