git push不同步worktree目录

时间:2016-10-31 16:05:57

标签: git

我正在使用区域设置存储库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

2 个答案:

答案 0 :(得分:1)

TL; DR摘要:在顶部添加#!

我认为您的接收后脚本实际上只是单行:

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 shtype sh找出sh口译员所在的位置,或which bashtype 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变量上)。