Git:裸回购能否跟踪其他非Git位置?如果是,怎么做?

Git:裸回购能否跟踪其他非Git位置?如果是,怎么做?,git,Git,我有一个只接受推送的裸回购。当进行这样的推送时,我希望这些更改能够通过裸repo反映到另一个位置(不是克隆,只是一个没有.git文件夹的静态位置) 这可能吗?当然可以。为了在有人推的时候做一些动作,创建一个。为了将这些更改从一个裸存储库转移到另一个目录(不是Git存储库)中,您需要创建一个目录,并在要更新的位置将其展开 post receive钩子在标准输入上接收通过推送更新的所有引用及其新旧值的列表,格式如下(其中SP是空格字符,和是修订,而是更新的引用): 编辑:注意这有一个相当严重的缺点;

我有一个只接受推送的裸回购。当进行这样的推送时,我希望这些更改能够通过裸repo反映到另一个位置(不是克隆,只是一个没有.git文件夹的静态位置)


这可能吗?

当然可以。为了在有人推的时候做一些动作,创建一个。为了将这些更改从一个裸存储库转移到另一个目录(不是Git存储库)中,您需要创建一个目录,并在要更新的位置将其展开

post receive
钩子在标准输入上接收通过推送更新的所有引用及其新旧值的列表,格式如下(其中
SP
是空格字符,
是修订,而
是更新的引用):


编辑:注意这有一个相当严重的缺点;如果删除(或移动)文件,则不会删除目标目录中的该文件。一个可能的解决方案是添加
rm-rf/path/to/expand/into;存档行前的mkdir/path/to/expand/into

同意布赖恩的观点。但是,用例是什么?如果要跟踪更改,为什么不进行克隆?

我想节省空间。有了额外的.git文件夹,这几乎是一个复制的裸回购协议,使整个事情大50%。还有其他用途:非git位置可以映射到网络驱动器(因此git认为它是本地目录,但实际上文件是通过ftp发送到服务器的)。很好。那么,
git archive master
是否将master中的整个树放入存档?如果是这样的话,我怎么才能得到从oldrev更新到newrev的文件,而不是整个文件结构呢?如果有办法只得到修改/添加的文件,那就太好了。@trusktr是的,
git archive master
只创建一个tar存档,然后将其扩展到要写入它们的位置。我建议不要只写更改过的文件;问问你自己,如果由于某种原因,你的脚本在一次推送中失败了怎么办?这些文件不会被写入,如果下一次推送涉及不同的文件,您将失去同步。如果你真的只想写出修改过的文件,你可以开始做一个
git diff$old$new | patch-p1-d/path/to/expand/into
@trusktr,但在这一点上,你真的必须问问自己“为什么我要手动保持此git repo与此目录同步,而git本身正是为此而设计的?”您在另一条评论中提到,您担心第二个git存储库的空间。如果您知道您将始终保持这两个存储库的同步,您可以在创建第二个存储库时使用(非裸)存储库,这意味着它将与裸repo共享其对象空间,占用最小的额外空间。@trusktr是的,如果您使用
git clone-s
克隆repo,它将拥有自己的所有引用和跟踪其签出内容的信息,但它将共享对象存储(文件、目录列表和修订数据)与另一个repo。您必须小心使用
git clone-s
,因为如果您导致在一个repo中无法访问对象,它们可能会被垃圾收集(删除),但如果它们仍然可以从另一个回购中访问,则可能会导致问题。但是,在您的用例中,当一个回购只是用于镜像另一个回购时,应该可以。
<old-value> SP <new-value> SP <ref-name>
#!/bin/sh
while read old new ref; do
    if [ "$ref" = master ]; then
      git archive master | tar -x -C /path/to/expand/into
    fi
done