Git 如何将AppleScript脚本置于版本控制之下?

Git 如何将AppleScript脚本置于版本控制之下?,git,applescript,Git,Applescript,我想知道这是否是最好的解决方案: 将文件置于版本控制之下 创建一个安装脚本,用osacile 但是还有.scptd目录。或者我可以将.applescript和.scpt文件都置于版本控制之下 最好的解决方案是什么?我总是将.applescript(纯文本文件)放在版本控制()中。通过这种方式,我可以很容易地比较不同的版本,对于多用户来说也很容易。您可以突出显示其他用户所做的更改。这在二进制文件中是不可能的,比如编译后的脚本文件 编辑:现在是一个“官方”gitfilter,名为。它建立在这个想

我想知道这是否是最好的解决方案:

  • 将文件置于版本控制之下
  • 创建一个安装脚本,用
    osacile
但是还有
.scptd
目录。或者我可以将
.applescript
.scpt
文件都置于版本控制之下


最好的解决方案是什么?

我总是将.applescript(纯文本文件)放在版本控制()中。通过这种方式,我可以很容易地比较不同的版本,对于多用户来说也很容易。您可以突出显示其他用户所做的更改。这在二进制文件中是不可能的,比如编译后的脚本文件

编辑:现在是一个“官方”gitfilter,名为。它建立在这个想法的基础上,修正了OSA的一些怪癖


如果使用git,您可以使用a透明地(1)反编译SCPT文件,以便只提交AppleScript源代码(称为“清理”二进制SCPT)和(2)签出时重新编译回SCPT(称为“涂抹”AppleScript源代码)

首先将以下名为
git ascr filter
的shell脚本添加到
/usr/local/bin

#/垃圾箱/垃圾箱
如果[$#-ne 2];然后
echo“用法:$0--clean/--smudge文件”>&2
出口1
其他的
如果[“$1”=”--clean”];然后
OSA反编译“$2”| sed's/[:space:][]*$/'
elif[“$1”=”--smudge”];然后
TMPFILE=`mktemp-t tempXXXXXX`
如果[$?-ne 0];然后
echo“错误:\`mktemp'未能创建临时文件。”>&2
出口3
fi
如果!mv“$TMPFILE”“$TMPFILE.scpt”;然后
echo“错误:无法创建临时SCPT文件。”>&2
rm“$TMPFILE”
出口4
fi
TMPFILE=“$TMPFILE.scpt”
#在stdin上编译AppleScript源代码。
如果!osacile-l AppleScript-o“$TMPFILE”;然后
rm“$TMPFILE”
出口5
fi
类别“$TMPFILE”和rm“$TMPFILE”
其他的
echo“错误:未知模式“$1”>&2
出口2
fi
fi
确保
chmoda+x
脚本

通过运行以下命令配置“ascr”筛选器:

git config filter.ascr.clean "git-ascr-filter --clean %f" git config filter.ascr.smudge "git-ascr-filter --smudge %f" 现在,每当您更改SCPT文件并添加它时,反编译的AppleScript源代码将被暂存,而不是二进制SCPT。此外,每当您签出一个SCPT文件(它实际上作为AppleScript blob存储在存储库中)时,SCPT文件都会在磁盘上重新创建。

我喜欢,但它对我来说有点太复杂了,我不希望人们为了使用我的github项目而实现它。一个更简单的选项是告诉diff进程使用反编译textconv,它只允许您查看diff中的文本更改

添加到.gittributes 添加到.git/config 这是我公司的样品差异
非常感谢@DanielTrebbien的回答,他的回答引导我进行osadecompile。

我将纯文本.applescript文件保存在Git中,并且我有一个简单的Bash脚本,每当我想要构建应用程序时,我都会运行它,它负责编译applescript。这是我的剧本:

#!/usr/bin/env bash

APPNAME="My Awesome App"

# make sure we're in the right place
if [ ! -d ".git" ]; then
    echo "ERROR: This script must be run from the root of the repository."
    exit
fi

# clear out old build
rm -r dist/*
mkdir -p "dist/$APPNAME.app/"

# copy files
cp -r app/* "dist/$APPNAME.app/"

# compile all applescript
cd "dist/$APPNAME.app/Contents/Resources/Scripts/"
for f in *.applescript
do
    osacompile -o "`basename -s .applescript "$f"`.scpt" "$f"
    rm "$f"
done
此脚本假定您的整个应用程序(即
Contents/
文件夹和其中的所有内容)都位于Git存储库根目录下的
app/
文件夹中。它将所有内容复制到
dist/
中的应用程序的新副本中,然后编译新副本的
Contents/Resources/Scripts/
文件夹中的所有AppleScript文件


为了自己使用它,我建议将我的脚本复制到存储库根目录中的
bin/build.sh
,运行
chmod+x bin/build.sh
使其可执行,然后只要在任何时候运行
/bin/build.sh
就可以了。

我只会将代码放在repo中,那么代码就是真理,只有代码的版本有争议,而编译代码的版本可能与源代码不一致。我不确定你所说的版本控制是什么意思。@charlax,在获得了一些投票确认这对我以外的人有效后,我对我的答案很有信心。你应该试着实现我的答案。(选择偶数;-)谢谢!然后使用OSAComile编译它?如果使用的是xcode,请打开“仅保存exec”标志,文件将在编译时编译。对于纯applescript文件,我将源文件保存在svn中,并在需要时将其保存为编译脚本。如果您认为仍然需要OSAComile(例如,从纯applescript文件加载脚本对象),也可以使用“run script file theFile”命令,只要运行处理程序在结束时返回自身(return me)。感谢OSAComile的指导。我提出了一个不同的解决方案,但是没有你我无法解决。我觉得这种方法可以避免scpt文件在github中不可见的问题,但我担心克隆存储库的其他人也需要添加此内容。@studgeek:没错。AppleScript源代码可以在GitHub中查看,任何克隆存储库的人都必须安装
git ascr filter
脚本并运行两个
git config
命令。我发现:TextMate使用自己的二进制文件来反编译AppleScript。它在GitHub上:仍然需要测试是否可以创建scptd+sdef,尽管…@doekman我认为这是二进制文件的源代码:这对于查看更改非常有用,但对合并没有帮助。不幸的是,您仍在尝试合并二进制文件,这很棘手。@DarrickHerwehe,合并二进制文件比合并更糟糕。这是不可能的。要合并文件,您需要做的是对文件的两个版本进行反编译,然后手动合并。为此,我使用了
vimdiff
,当我看到它时,我将文本复制回AppleScript GUI。绝对不可怕,但比合并Ph更好
*.scpt diff=scpt
[diff "scpt"]
  textconv = osadecompile
  binary=true
$ git diff
--- a/AppleScript-droplet.app/Contents/Resources/Scripts/main.scpt
+++ b/AppleScript-droplet.app/Contents/Resources/Scripts/main.scpt
@@ -1,3 +1,3 @@
-on open filelist
-       ## Set useTerminal to true to run the script in a terminal
-       set useTerminal to true
+on open file_list
+       ## Set use_terminal to true to run the script in a terminal
+       set use_terminal to true
#!/usr/bin/env bash

APPNAME="My Awesome App"

# make sure we're in the right place
if [ ! -d ".git" ]; then
    echo "ERROR: This script must be run from the root of the repository."
    exit
fi

# clear out old build
rm -r dist/*
mkdir -p "dist/$APPNAME.app/"

# copy files
cp -r app/* "dist/$APPNAME.app/"

# compile all applescript
cd "dist/$APPNAME.app/Contents/Resources/Scripts/"
for f in *.applescript
do
    osacompile -o "`basename -s .applescript "$f"`.scpt" "$f"
    rm "$f"
done