尝试添加Mac自定义图标文件时,svn在路径'Icon \ 015'中返回“无效控制字符'0x0d'”

时间:2011-06-09 18:14:12

标签: svn macos finder diskimage

我有一个创建磁盘映像的项目,并希望为已加载的卷使用自定义图标。我有一个看起来很棒的.VolumeIcon.icns文件,但为了让Finder使用它,我必须包含一个名为Icon^M的空文件(Icon \ r \ n,Icon< cr>)。我的自定义图标显示出来,一切正常。

除。当我尝试将Icon ^ M文件检入我的svn存储库时,我得到:

svn: Invalid control character '0x0d' in path 'Icon\015'

Subversion具有比Mac更严格的文件名标准,并且合理地说,不允许回车。 svn邮件列表上的旧线程讨论了这个问题,建议只使用shell脚本创建文件作为构建过程的一部分。我可以做到这一点,但我的构建过程现在很简单,我不愿意让它变得更复杂。

有更优雅的解决方案吗?

5 个答案:

答案 0 :(得分:2)

图标的这个问题困扰了我一段时间。基本的解决方案基本上是完全忽略文件,我拒绝这样做,因为我是一个视觉人,喜欢浪费时间为我的项目创建很酷的图标。

注意:我尽力确保它有效,但我无法保证,所以请尝试复制一份数据。据说这是我解决这个问题的方法。

基本上我创建了3个脚本来解决mac icon \ r \ n问题。

  1. repoMacPrepare.sh
  2. repoMacRestore.sh
  3. gitAliasScript.sh
  4. 这三个脚本用于以git或svn可以接受和存储的格式添加mac图标。第一个脚本准备存储库,在目录中搜索基于Icon的文件,在文件中搜索自定义图标格式。然后将它们存储为各自路径中的.jdIcnd或.jdIcnf(d表示文件夹的目录f)。

    第二个脚本允许通过搜索.jdIcnd和.jdIcnf文件使其恢复生命。

    最后一个脚本显示了如何自动化该过程。我使用git的别名来引用我的.bashrc文件中的gitAliasScript.sh脚本。现在我切换到git(我做的最好的事情)所以脚本是为git显示的,但是svn中的基础是相同的。我希望这可以帮助mac用户使用版权系统,他们不会在签入过程或结帐过程中丢失图标。另请注意,那些不使用此脚本的人不会有问题,因为图标存储为带有点前缀的二进制文件,使其不可见。哦,是的......

    file:repoMacPrepare.sh

    #! /bin/bash
    #
    # Author: Joshua Demori
    # Email: jdemori@jrdfamily.com
    #
    # This script is used to prepare a repository
    # to still record the Icons used on a mac for files or directories
    #
    # First
    # DeRez Icon^M > .IconCntrlR
    # (hit control-v then enter to get the carriage return vi)
    # 
    # Store in Repository
    # then to bring back
    # Rez -append IconCopy -o Icon
    # # may need to set the Folders Icon Info
    # SetFile -a C /Path/To/Custom/Folder/With/Icon/
    # 
    # if I need to SetFile the folder I can do this 2 ways
    # a main file which has all this data at base of repository (bad)
    # as it finds those files it does the folder below it
    #
    #
    
    #=======================================================#
    # Defines
    readonly  VERSION=1.00
    
    #=======================================================#
    # Variables
    varVerbose=false
    
    #=======================================================#
    # Functions
    setupDirIcon () {
        DeRez "${file}"/Icon
     > "${file}"/.Icon.jdIcnd
    if [ $varVerbose == true ]; then
        echo Adding Icon File: "$file"/.Icon.jdIcnd
    fi
    }
    
    
    setupFileIcon () {
        base=`basename "$file"` 
        path=`dirname "$file"`  
        DeRez "$file" > "${path}"/."${base}".jdIcnf
    if [ $varVerbose == true ]; then
        echo Adding Icon File: "$file"/."${base}".jdIcnf
    fi
    }
    
    # cmd line functions
    function funcOptionVersion {
        echo "Reposiotry Mac Icon Preperation Script Version: $VERSION"
        exit 0
    }
    
    
    function funcOptionHelp {
        name=`basename $0`
        echo $name Help Screen
        echo '-h help'
        echo '-v verbose'
        echo '-n version'
        echo ' '
        exit 0
    }
    
    function funcOptionVerbose {
        varVerbose=true
    }
    
    
    #=======================================================#
    # process cmd line arguments
    while getopts "vhn" optionName; do
    case "$optionName" in
    n) funcOptionVersion ;;
    h) funcOptionHelp ;;
    v) funcOptionVerbose ;;
    [?]) printErrorHelpAndExit "$badOptionHelp";;
    esac
    done
    
    #=======================================================#
    #=======================================================#
    # Start main portion of script
    
    # ignore . .DS_Store .git folders and files
    find . | grep -v ^.$ | grep -v .DS_Store | grep -v .git | grep -v .svn | while read file
    do
    
    # does this file have an icon attribute
    GetFileInfo -a "$file" | grep C > /dev/null
    if [ $? = 0 ]; then
        if [ -d "$file" ]; then
            setupDirIcon
        else
            setupFileIcon
        fi
    fi # end if for icon test
    
    done
    
    # Remove Only the Icon file used by directories
    echo Removing Icon File
    
    if [ $varVerbose == true ]; then
        find . -name Icon
     -print -exec rm {} \;
    else
        find . -name Icon
     -exec rm {} \;
    fi
    

    file:repoMacRestore.sh

    #! /bin/bash
    #
    # Author: Joshua Demori
    # Email: jdemori@jrdfamily.com
    #
    # This Script complemnts xxxx by reversing the icons as derez to rez
    # then setting the proper file attributes to view the icons
    #
    # First
    # DeRez Icon^M > .IconCntrlR
    # (hit control-v then enter to get the carriage return vi)
    # 
    # Store in Repository
    # then to bring back
    # Rez -append IconCopy -o Icon
    # # may need to set the Folders Icon Info
    # SetFile -a C /Path/To/Custom/Folder/With/Icon/
    # 
    # if I need to SetFile the folder I can do this 2 ways
    # a main file which has all this data at base of repository (bad)
    # as it finds those files it does the folder below it
    #
    #
    
    
    #=======================================================#
    # Defines
    readonly  VERSION=1.00
    
    #=======================================================#
    # Variables
    varVerbose=false
    
    #=======================================================#
    # Functions
    # cmd line functions
    function funcOptionVersion {
      echo "Repository Mac Icon Restore Script Version: $VERSION"
      exit 0
    }
    
    
    function funcOptionHelp {
      name=`basename $0`
      echo $name Help Screen
      echo '-h help'
      echo '-v verbose'
      echo '-n version'
        echo ' '
      exit 0
    }
    
    function funcOptionVerbose {
        varVerbose=true
    }
    
    
    #=======================================================#
    # process cmd line arguments
    while getopts "vhn" optionName; do
    case "$optionName" in
    n) funcOptionVersion ;;
    h) funcOptionHelp ;;
    v) funcOptionVerbose ;;
    [?]) printErrorHelpAndExit "$badOptionHelp";;
    esac
    done
    
    
    #=======================================================#
    #=======================================================#
    # Start main portion of script
    
    
    #=======================================================#
    # Go thourgh directories
    find . -name *.jdIcnd |  while read file
    do
    
    # is it a dir - restore dir icon
    echo "$file" | grep jdIcnd
    if [ $? = 0 ]; then
        if [ $varVerbose == true ]; then
            echo Fixing Directory Icon: "$file"
        fi
        path=`dirname "$file"`  
        Rez "$file" -o "${path}"/Icon
        SetFile -a V "${path}"/Icon
        SetFile -a C "${path}"
    fi
    
    done
    
    # Go thourgh files
    # is it a file - restore file icon
    find . -name *.jdIcnf |  while read file
    do
    echo "$file" | grep jdIcnf
    if [ $? = 0 ]; then
        path=`dirname "$file"`
        base=`basename "$file"`
        origFileName=`echo "$base" | sed 's/\.jdIcnf//'`
        origFileName=`echo "${origFileName:1}"`
        fileWithPath="${path}"/"${origFileName}"
        if [ $varVerbose == true ]; then
            echo Restoring File Icon: "$path"
        fi
        #echo origFileName: "$origFileName"
        #echo filesWithPath: "$fileWithPath"
        Rez -append "$file" -o "$fileWithPath"
        SetFile -a C "$fileWithPath"
    fi
    
    done
    

    gitAliasScript.sh

    #! /bin/bash
    
    found=false
    args=("$@")
    for var in "$@"
    do
        x=`echo $var | grep -ic commit`
        if [ $x == 1 ]; then
            # prepare icons to be saved
            # add them to repository
            # at the end git is run
            repoMacPrepare.sh
            find . -name *.jdIcnd -exec git add {} \;
            find . -name *.jdIcnf -exec git add {} \;
            found=true
        fi
    done
    
    #runs git cmd here
    cmdPart='git '
    cmd=${cmdPart}${@}
    $cmd
    
    # finish by bringing back icons
    # if commit was called
    if [ $found == true ]; then
        repoMacRestore.sh
    fi
    
    exit 0
    

答案 1 :(得分:1)

我猜测将文件放在tar等档案中会允许你上传它。 让我看看它是否真的有效......看起来我是对的:

$ touch  hello^Mhaha
$ svn add hello^Mhaha 
svn: Invalid control character '0x0d' in path 'hello\015haha'
$ tar cf hellorhaha.tar hello^Mhaha 
$ svn add hellorhaha.tar 
A  (bin)  hellorhaha.tar

也许不是你正在寻找的东西,但是让你添加文件几乎没有喧嚣。无论如何我会这样做。实际上我不会在我的文件名中添加换行符或回车符,但是嘿..给他自己的每一个。

答案 2 :(得分:1)

我觉得你很健壮。你现在用什么来建造?我会向那些能够提出比你自己提出的答案更好的答案的人倾斜 - 在构建中编写脚本。

答案 3 :(得分:-1)

这种情况发生在我身上,因为在我将图标文件重命名为Icon.png之后,有没有扩展名的图标文件(在本例中为.png),这一切都没关系:)

答案 4 :(得分:-1)

制作〜/ .subversion / config的副本 然后通过首先找到如下所示的行来编辑〜/ .subversion / config:

  

global-ignores = * .o * .lo * .la * .al .libs * .so .so。[0-9] * .a * .pyc * .pyo

然后在config中添加一个新行:

  

global-ignores = Icon?

保存配置文件。这将忽略名称以" Icon"开头的所有文件。加上一个额外的角色。

不如忽略无视该文件的名称。但它可以起到警告作用。