我可以使用git专家的一些指导来确保对非裸存储库的推送操作安全.基本上我有一个关于如何做到这一点的计划,并且可以使用关于该计划是否合理的一些建议:)
通常,当您在git中推送到非裸存储库时,其工作副本和索引不会更新.正如我所发现的,如果您忘记以后手动更新它们,这可能会导致严重的问题!
在我们的小组中,我们有一些"中心"存储库,人们克隆并推回,但许多人也希望能够克隆他们的克隆,并按照真正的分布式方式在他们之间推/拉.为了使这个安全,我想确保通过"clone"或"init"创建的每个存储库都有一个自动安装的post-receive挂钩,它将在推送操作后更新工作目录和索引,以便与新HEAD.
我发现我可以通过在hooks子目录中使用post-receive hook创建一个模板目录来实现这一点,然后让我的组中的每个人都执行:
git config --global init.templatedir /path/to/template/dir
Run Code Online (Sandbox Code Playgroud)
目前我的post-receive挂钩看起来像这样:
export GIT_WORK_TREE=..
git checkout -f HEAD
Run Code Online (Sandbox Code Playgroud)
这个SEEMS按照需要工作,但我对checkout命令有一些不确定性.为了将工作目录和索引与HEAD中的状态同步,"git checkout -f HEAD"和"git reset --hard HEAD"是否相同?
我问,因为虽然我知道"git reset --hard HEAD"会做我想要的,但是在我的测试中使用它在后接收钩子中大大减慢了推送操作(它似乎重新检查了所有文件,无论工作目录中的文件是脏还是干净)."git checkout -f HEAD"SEEMS更快地做同样的事情(给我一个干净的工作目录和索引与HEAD同步),但我有点紧张,因为checkout命令倾向于在飞行中做与未提交的工作目录更改合并.这个命令真的会给我一个工作目录和索引,它在所有情况下都与HEAD中的状态完全匹配(包括,例如,文件删除,重命名等)?
提前感谢任何建议!
我有GIT的这个场景:
我希望在推送中更改特定文件时"执行某些操作".例如,如果更改了.sql文件,则必须将其转储到数据库中.
我在GIT中使用'post-receive'钩子,声明如下:
DUMP=$(git diff-tree --name-only -r -z master dump.sql);
if [ -n "$DUMP" ]; then
// using the new dump.sql
fi
Run Code Online (Sandbox Code Playgroud)
如何才能访问刚挂钩的新dump.sql?
我有一个git post-receive钩子,它提取了在"git push"期间添加的所有修订版,并对每个修订版进行了一些处理(例如发送通知电子邮件).这种方法很有效,除非合并时; 例如:
我怎么能避免这个?下面是我的post-receive钩子的开头,我提取了应该处理的提交(最后$ COMMITS保存了要处理的提交列表).
#!/bin/sh
REPO_PATH=`pwd`
COMMITS=''
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# for each ref that was updated during the push
while read OLD_REV NEW_REV REF_NAME; do
OLD_REV="`git rev-parse $OLD_REV`"
NEW_REV="`git rev-parse $NEW_REV`"
if expr "$OLD_REV" : '0*$' >/dev/null; then
# if the branch was created, add all revisions in the new branch; skip tags
if ! expr "$REF_NAME" : 'refs/tags/' >/dev/null; then
REF_REV="`git rev-parse $REF_NAME`"
REF_NAME="`git name-rev --name-only $REF_REV`"
COMMITS="$COMMITS `git rev-list $REF_NAME | git name-rev --stdin …
Run Code Online (Sandbox Code Playgroud) 我一直在玩钩子一段时间,但我似乎无法post-receive
按照我需要的方式工作.
我试图获取post-receive
钩子来创建一个zip文件夹,并在我将更改推送到存储库后将其放在git存储库文件夹之外的某个位置.
目前我正在使用gitolite来管理我的存储库和用户.每次推送后我都成功设置了通知邮件.命令是
chmod a+x post-receive-email
cd /path/to/your/repository.git
ln -sf /usr/share/doc/git-core/contrib/hooks/post-receive-email hooks/post-receive
Run Code Online (Sandbox Code Playgroud)
通知邮件仅包含更改摘要.我想在该推送中添加每个修改文件的更改行.我知道编辑该post-receive-email文件并且必须使用git-diff命令.我的问题是
什么是我必须使用的确切git-diff命令..?我在那个post-receive-email文件中添加该命令的地方..?有没有任何配置可用于gitolite ..?
这已被问过很多次,我经历了无数的线程和谷歌页面,但似乎没有人能解决我的问题.也许我不是以标准的方式做到这一点,但它应该仍然有效.
我有一个有git repo的远程服务器
我通过ssh从本地推送到它:
git add Y:\NetBeansProjects\pics\pics-client-branding\src\main\java\com\waudware\pics\viewer\TypeTopComponent.java
git commit -m Testing GIT Friday 8 Y:\NetBeansProjects\pics\pics-client-branding\src\main\java\com\waudware\pics\viewer\TypeTopComponent.java
Commit Log
revision : b2d7fd5cbafbfddfccf8d3c8ac75614c4b357887
author : Denis <Denis@WWOscar.Waudware.local>
date : Jun 21, 2013 3:21:47 PM
summary : Testing GIT Friday 8
INFO: End of Commit
==[IDE]== Jun 21, 2013 3:21:48 PM Committing... finished.
==[IDE]== Jun 21, 2013 3:21:52 PM Pushing
git push ssh://wwbert/cygdrive/d/Shared_Data/Development/dev_NetBeans/Projects/PICS.git +refs/heads/master:refs/heads/master
Remote Repository Updates
Branch : master
Old Id : e51af3dbc01ee2372f9c92bb8070cb1100bef220
New Id : b2d7fd5cbafbfddfccf8d3c8ac75614c4b357887
Result : OK
Local Repository Updates …
Run Code Online (Sandbox Code Playgroud) 我有一个git hook(post-receive
),看起来像这样:
#!/bin/sh
cd /home/vservices
while read OLDSHA NEWSHA REF ; do
if [[ "$NEWSHA" == "0000000000000000000000000000000000000000" ]]; then
git --git-dir=/home/vservices/.git --work-tree=/home/vservices fetch -p origin
else
git --git-dir=/home/vservices/.git --work-tree=/home/vservices pull
fi
done
Run Code Online (Sandbox Code Playgroud)
我运行时收到此错误消息git push dev :test2
:
remote: hooks/post-receive: 10: [[: not found
remote: Your configuration specifies to merge with the ref 'test2'
remote: from the remote, but no such ref was fetched.
Run Code Online (Sandbox Code Playgroud)
我不太了解sh
,所以我做错了什么?
我编写了简单的 shell 脚本来抛出“成功和失败消息”,并将它放在 .git/hooks/ 下,并具有所有适当的权限。我想将此脚本称为后接收。但是脚本不起作用,运行脚本很简单,但是作为接收后钩子它不起作用。
他们的东西被遗漏了还是我错误地理解了接收后挂钩。有人可以解释客户端和服务器端挂钩以及如何执行它们。
我已经搜索过它,但无法理解。
假设我有一个origin
添加的上游repo()
git remote add origin file:////upstream.host/repo.git
Run Code Online (Sandbox Code Playgroud)
这repo.git
是一个Windows共享文件夹,我和我的开发人员分配了r/w访问权限.
现在,我想设置一个post-receive
钩子upstream.host
,通知Trac关于自动票证更新的新推送修订.基本上,这是通过调用一个可执行文件来完成的,upstream.host
那里有一些工作在那里的数据库.
但是,由于某种原因,我通知钩子不起作用.所以我设置了钩子来打印她正在做的所有事情D:/temp/post-receive.log
并发出一个git push
以触发钩子.
当我查看D:/temp
时upstream.host
,没有创建日志文件.然后,我想到了另一个问题:https://superuser.com/questions/974337/when-i-run-a-git-hook-in-a-repo-on-a-network-share-which-二进制文件被使用.实际上我的机器的二进制文件用于执行挂钩时,也可能使用我的机器的路径.我调查了D:/temp
一下,在这里,我们有了post-receive.log
.
我跟踪pwd
到日志文件,它不是D:/repos/repo.git
(我的预期),但实际上是//upstream.host/repo.git
.显然,整个钩子是在推进器机器的上下文中执行的,而不是在repo机器(upstream.host
)的上下文中执行的.
这对我来说没有问题,因为我有远程机器的管理员权限,并且可以使用管理共享来获取我的钩子(即\\upstream.host\D$\repos\repo.git
等).但这对我的同事来说是一个问题,因为他们是普通的用户,没有根源.
如何post-receive
正确设置我的钩子以使其按预期工作?
如何在不使用机器上的任何东西的情况下强制我的钩子完全在远程机器上运行?
我真的必须实现托管我的仓库的真实服务器吗?还是有其他方法不需要服务器?
在服务器上,/ home/git/xxx/hooks/post-receive:
#!/bin/bash
cd /var/www/xxx
git pull
Run Code Online (Sandbox Code Playgroud)
在服务器上,/ var/www/xxx是这样创建的:
cd /var/www
git clone /home/git/repositories/xxx.git
Run Code Online (Sandbox Code Playgroud)
当我在客户端上运行"git push"时,收到以下消息:
remote: fatal: Not a git repository: '.'
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我最近在我的数字海洋水滴上设置了 post-receive hooks,并将它与我的 laravel 本地项目连接起来。一切都很好,除了我的公共/存储/图像不会在每次提交时上传。我试图编辑我的本地 .gitignore 文件,因此它不包含 public/storage 文件夹,但在我提交时没有上传任何内容。这是我当前的 .gitignore 文件内容
/node_modules
/public/hot
/storage/framework/*.key
/storage/logs/*.key
/vendor
/.idea
/.vscode
/.vagrant
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.env
.phpunit.result.cache
Run Code Online (Sandbox Code Playgroud)
我改变了 /public/storage 和 /storage/*.key
谢谢克里斯
我已经按照本教程"使用Git管理网站",使用Tower提交并将我的本地存储推送到远程服务器.通过以下消息推送成功:
Pushing to ssh://user@mysite.com/~/git/tprevo.git
stdin: is not a tty
Counting objects: 40, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (37/37), done.
Writing objects: 100% (40/40), 171.95 KiB, done.
Total 40 (delta 3), reused 0 (delta 0)
To ssh://user@mysite.com/~/git/tprevo.git
* [new branch] master -> production
updating local tracking ref 'refs/remotes/production/production'
Successfully created tracking connection.
Run Code Online (Sandbox Code Playgroud)
我已经验证我的post-receive挂钩正在执行,但该checkout
命令没有将推送的代码添加到我认为我已设置为我的工作目录的内容中.我一直试图弄清楚这一点.
后得到:
#!/bin/sh
GIT_WORK_TREE=/home/tprevo/public_html/tprevo git checkout -f
Run Code Online (Sandbox Code Playgroud)
我是Git的新手,非常热衷于学习.调试这个的最佳方法是什么?
git ×12
git-post-receive ×12
githooks ×5
git-bash ×1
git-checkout ×1
git-diff ×1
git-pull ×1
gitolite ×1
hook ×1
repository ×1
sh ×1
windows ×1