svn возвращает "Недопустимый управляющий символ" 0x0d "в пути" Icon\015 "" при попытке добавить файл пользовательских значков Mac
У меня есть проект, который создает образ диска и хотел бы использовать пользовательский значок для загруженного тома. у меня есть .VolumeIcon.icns
файл, который выглядит великолепно, но чтобы Finder использовал его, мне пришлось включить пустой файл с именем Icon^M
(Значок \ r, значок
Кроме. Когда я пытаюсь проверить файл Icon^M в моем хранилище SVN, я получаю:
svn: Invalid control character '0x0d' in path 'Icon\015'
Subversion имеет более строгие стандарты имен файлов, чем Mac, и разумно не допускает возврат каретки. Старый поток в списке рассылки svn обсуждал эту проблему, и рекомендация состояла в том, чтобы просто создать файл со сценарием оболочки как часть процесса сборки. Я мог бы сделать это, но мой процесс сборки сейчас очень прост, и я не хочу делать его более сложным.
Есть ли более элегантное решение?
5 ответов
Я думаю, что ты костей. Что вы используете, чтобы построить сейчас? Я передам свою шляпу любому, кто может придумать лучший ответ, чем тот, который вы сами предложили - написать его в сборке.
Эта проблема с иконами беспокоила меня в течение некоторого времени. Основное решение состояло в том, чтобы полностью игнорировать файл, что я отказался сделать, поскольку я визуальный человек и люблю тратить свое время на создание классных иконок для моих проектов.
Примечание: я сделал все возможное, чтобы убедиться, что это работает, но я не могу этого гарантировать, поэтому попробуйте скопировать ваши данные. С учетом сказанного здесь было мое решение этой проблемы.
В основном я создал 3 сценария для решения проблемы с иконкой Mac.
- repoMacPrepare.sh
- repoMacRestore.sh
- gitAliasScript.sh
Эти три сценария используются для добавления значков Mac в формате, который git или svn могут принимать и хранить. Первый сценарий подготавливает хранилище для поиска файлов на основе значков в каталогах и пользовательских форматов значков в файлах. Затем сохраняет их как.jdIcnd или.jdIcnf (d для каталога f для папки) в их соответствующих путях.
Второй сценарий позволяет восстановить его на Mac путем поиска файлов.jdIcnd и.jdIcnf.
Последний скрипт показывает, как автоматизировать процесс. Я использую псевдоним для git, который ссылается на скрипт gitAliasScript.sh в моем файле.bashrc. Теперь я переключился на git (лучшее, что я сделал), поэтому скрипт показан для git, но основы в svn такие же. Я надеюсь, что это поможет пользователям Mac, использующим системы управления версиями, которые не потеряют свои значки в процессе регистрации или проверки. Также обратите внимание, что у тех, кто не использует этот скрипт, проблем не будет, поскольку значки хранятся в виде двоичных файлов с префиксом точки, что делает их невидимыми. Ооо да...
файл: 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
файл: 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
Я предполагаю, что помещение файла в архив, такой как 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
Возможно, не то, что вы ищете, но позволяет добавить файл практически без суеты. В любом случае, я бы так и сделал. На самом деле, я бы не вставлял в имена файлов переводы строк и возврат каретки, но эй.. каждому свое.
Сделайте копию ~/.subversion/config Затем отредактируйте ~/.subversion/config, сначала найдя строку, которая выглядит следующим образом:
global-ignores = *.o *.lo *.la *.al.libs *.so .so. [0-9] *.a *.pyc *.pyo
Затем добавьте после этого новую строку в конфигурации:
global-ignores = значок?
Сохраните файл конфигурации. Это будет игнорировать все файлы, чье имя начинается с "Icon" плюс один дополнительный символ.
Не так хорошо, как игнорировать игнорирование точно, как назван этот файл. Но это работает с оговоркой.
Это происходит со мной, потому что после того, как я переименовал файл значков в Icon.png, был файл значков без расширения (в данном случае.png), все было хорошо:)