我正在使用区域设置存储库set appBundleId to do shell script "osascript -e " & ("id of application \"" & appRef & "\"")'s quoted form & " || osascript -e " & ("id of application id \"" & appRef & "\"")'s quoted form & " || :"
set doesExist to (appBundleId ≠ "")
现在,我必须在服务器端执行$HOME/some_git_repo
,每次我需要更新任何内容。 (我可以处理)。
问题在于,不能同步服务器端(远程)git checkout
中的任何内容。
这意味着/var/www/some_git_repo
脚本无法正常工作
范围:
hooks/post_receive
答案 0 :(得分:1)
#!
行我认为您的接收后脚本实际上只是单行:
git --work-tree=/var/www/some_git_repo --git-dir=/var/repo/some_git_repo.git checkout -f
(我注意到这一点,来自your comment,与原始帖子略有不同,在行尾有checkout -f
;我还删除了一些不必要的引用标记,评论版本中缺少其中一个。)
根据您在another comment中描述的权限,您的操作系统似乎也是Linux或Solaris或类似Unix的变体:
$ ls -l hooks/post-receive
-rwxr-xr-x 1 root root 93 Oct 31 14:08
脚本 设置为可执行,这是必要的,但不是足够的:它需要标记可执行文件(并且是),但它也需要实际上可执行(而不是)。也就是说,底层操作系统必须将其识别为可以在没有帮助的情况下运行的程序。
/bin/sh
和/bin/bash
之类的命令行解释器(又名 shells )使用与底层操作系统不同的规则。如果文件被标记为可执行文件,但操作系统无法自行运行,则这些命令行解释程序将应用回退。他们会将脚本视为shell脚本,并自行运行。例如,他们会告诉操作系统运行/bin/sh
,并将脚本作为参数运行到/bin/sh
。 Git没有这样做:它依赖于可直接由OS执行的程序。
(哪个外壳是后备解释器?这取决于你正在运行的外壳,因为它的外壳正在进行后退。)
幸运的是,所有类似现代Unix的操作系统都提供了一种允许操作系统直接运行脚本的方法。只需使用至少两行(当然允许更多行)编写脚本,并使用以下形式的第一行行:
#! /bin/sh
或:
#! /bin/bash
或:
#! /usr/local/bin/bash
或适当的命令行解释器本身所在的任何地方。 (您可以运行which sh
或type sh
找出sh
口译员所在的位置,或which bash
或type bash
找出bash
的位置翻译生活,等等。例如,在我的一台机器上,我得到了:
$ which sh
/bin/sh
$ type sh
sh is /bin/sh
$ which bash
/usr/local/bin/bash
$ type bash
bash is /usr/local/bin/bash
而另一个人给了我:
sh-3.2$ which sh
/bin/sh
sh-3.2$ type sh
sh is /bin/sh
sh-3.2$ which bash
/bin/bash
sh-3.2$ type bash
bash is /bin/bash
表明不是每个翻译都会在每台机器上的同一位置结束。)
第一行使程序直接可由OS执行:操作系统找到相应的解释器并运行该解释器,将脚本的名称作为参数传递(就像shell自己一样)
请注意,这意味着您可以使用任何程序作为解释程序。 awk脚本可以从以下开始:
#! /usr/bin/awk
Python脚本可以以:
开头#! /usr/bin/python
您也可以通过这种方式运行Ruby脚本。您还可以使用/usr/bin/env
来解决解释器在不同计算机上不同位置的问题,这些问题往往不会移动(以便它始终位于{{1} }})但也应用/usr/bin
环境变量:
PATH
通过#! /usr/bin/env python
自动定位Python解释器,无论是&usr / bin / python还是/ usr / local / bin / python。 (当然,设置$PATH
至关重要,但它几乎总是 。)
如果您曾经想过为什么脚本在顶部有这些$PATH
行,现在您知道了。但他们可以做的不仅仅是让#!
脚本可以直接执行。
这是一个自我打印的脚本:
sh
操作系统通过在脚本名称上调用#! /bin/cat
I print myself!
来运行此操作。 /bin/cat
命令将脚本的内容打印到标准输出,然后退出。一个小麻烦是cat
行本身被打印出来,所以我们使用#!
解决了这个问题:
/bin/sed
操作系统将#! /bin/sed 1d
I print myself too,
and I elide my first line.
作为参数传递给脚本名称。由于1d
将其第一个参数视为编辑命令,而第二个参数作为输入文件,因此在复制到输出流之前删除第一行,然后打印剩余的行(/bin/sed
&#39 ; s默认操作是打印一行。)
这是一个自我删除脚本:
sed
除了娱乐之外,它没有任何功能。你可以运行一次,然后它就消失了。
有些操作系统允许在解释器之后使用多个参数,而其他操作系统只允许一个参数,有效地引用剩余的空白区域。您可以通过使用self - " awk" -ing脚本来判断您拥有哪种操作系统,当且仅当整个命令是一个#! /bin/rm -f
元素时才会起作用:
argv
当操作系统调用#! /bin/awk NR > 1 { print }
only one argument is passed
时,它会将其作为shell等效于:
/bin/awk
打印除第一行以外的所有行,或它将它作为shell等效于:
/bin/awk 'NR > 1 { print }' /path/to/script
引起awk投诉:
/bin/awk NR '>' 1 { print } /path/to/script
答案 1 :(得分:0)
嗯,这个响应不是优选的解决方案,但它解决了这个问题, 通过使用简单的可执行脚本更新工作树:
rsync -arv --exclude=something_tobe_excluded \
--progress repo_source-dir working_tree
每个文件/ directory_path必须指定为单个参数。 (在exclude
变量上)。