GIT推送-远程:致命:此操作必须在工作树中运行

GIT推送-远程:致命:此操作必须在工作树中运行,git,laravel,version-control,Git,Laravel,Version Control,我是GIT的新手。 我使用以下命令创建存储库: cd /home/user_name mkdir repo && cd repo mkdir site.git && cd site.git git init --bare 然后在hooks目录中,我创建post-receive文件并添加到那里: #!/bin/sh git --work-tree=/home/user_name/dev.ireserve.com --git-dir=/home/user_name/

我是GIT的新手。 我使用以下命令创建存储库:

cd /home/user_name
mkdir repo && cd repo
mkdir site.git && cd site.git
git init --bare
然后在
hooks
目录中,我创建
post-receive
文件并添加到那里:

#!/bin/sh
git --work-tree=/home/user_name/dev.ireserve.com --git-dir=/home/user_name/repo/site.git checkout -f
之后,我添加权限:
chmod+x post-receive

在laravel项目目录中的本地计算机上,我运行:

git init
然后我跑:

git remote add live ssh://root@example.com/home/user_name/repo/site.git
之后通常:

git add .
git commit -m "my message"
最后:

git push live master
但我得到一个信息:

remote: fatal: This operation must be run in a work tree


为什么我会犯这个错误?有什么问题吗?

从评论中可以看出,您的两侧都有一个目录,您需要开始创建版本,以便使用GIT的真正威力

如果您愿意使用
GIT add
,则需要创建分支(版本)

检查这个

要添加分支,请选中此项

这是来自的教程

这是最好的教程,IMHO;为了GIT

这将节省大量的精力和时间


快乐编码

TL;DR:我认为您的Laravel安装说明中缺少一个
mkdir
步骤


此命令:

git init --bare
是用来制作没有人会在其中做任何工作的服务器存储库的

现在,这似乎是一件奇怪的事情:为什么要创建一个没有人可以处理存储库的存储库?这是一件奇怪的事情,但它的存在是有原因的

裸存储库与非裸存储库 如果您制作了一个可以工作的存储库:

然后你就可以在里面工作了,但是过于简单化一点,其他人不应该不经通知就把他们的工作发给你。但人们也需要共享工作,一种常见的使用模式是,每个人都同意,在某个中央服务器(如公司的“主源存储库”机器)上的某个工作共享存储库应该是每个人发送工作的地方

但同时,你也不希望有人整天把人们的工作放到中央存储库中。您希望让人们在工作准备就绪后立即发送他们的工作,以便其他人可以立即前往中央存储库查看(甚至获取和使用)他们的工作。所以你需要一个地方,人们可以发送他们的工作,不事先通知,现在

这是一个
--裸
存储库。因为没有人在其中工作,所以您不会通过发送已完成的工作来覆盖他们正在进行的工作

这实际上是关于提交和工作树之间的区别 进行新的提交将为您的工作创建一个永久的、不可损坏的快照。但它必须从某处得到这个。在其他版本控制系统中,最小的“某处”是工作树:您工作的地方。Git在这里插入了一个额外的折痕,并迫使您了解它:它添加了索引,也称为临时区域,有时也称为缓存(三个名称代表一件事,在Git中它是一个非常重要的实体!)。不过,索引树和工作树是成对的:它们是您可以编写内容的地方。犯下的罪,一旦犯下,是完全不可改变的,这就是他们不可腐败的原因。所以你需要一个工作的地方,在那里你可以读写文件

裸存储库保存提交的只读快照,但没有工作树。2基本上就是这样:没有工作树,就没有工作的地方。这就是为什么它适合推,但没有工作的地方,你不能做任何工作。您还需要一个非裸存储库


1社区实际上大部分是永久性的:只要有人能找到它们的名字,它们就会持续下去。我将把这个细节留给其他教程。但是,它们是完全不可损坏的,因为提交的真实名称是其哈希ID。哈希ID虽然事先不可预测,但却是提交内容的加密校验和。如果出现问题,提交被破坏,Git会注意到,因为内容不再符合真实名称哈希ID

2由于有些愚蠢的实现原因,裸存储库仍然有一个索引。它只是没有工作树。它们与工作树中的索引(因此得名)配对,但是一个空存储库通常仍然有一个完全空的索引


一些服务器伪造了一个工作树作为一个裸存储库 您可以将裸存储库(没有工作树)与Git的挂钩机制结合起来,创建一种伪工作树。例如,这就是您的Laravel设置的工作方式。当您的裸服务器收到一个
git推送
时,服务器运行钩子,钩子运行
git--work tree=checkout-f
中设置一个临时工作树。此临时工作树是one
git checkout
命令期间的工作树。(索引现在为临时工作树建立索引。)然后
git签出完成,裸存储库仍然没有工作树。你还是不能在里面工作

请注意,最后一个
git--work tree=checkout-f
不会创建目录
。此目录必须已存在。它最初应该是空的;在第一个
git checkout-f
之后,它将包含
git checkout
编写的内容;在以后的每一次
git checkout-f
上,git都会(通过索引)假定它包含上次
git checkout-f
编写的内容,并根据此信息将其更新到位


因此,您最初的Laravel设置中应该有一个
mkdir home/user\u name/dev.ireserve.com

可能我不认为这是描述的。我在你发布的链接中找不到答案。。。你能帮我解决这个问题吗?你能检查一下你的机器上是否有分支,
git branch-a
Use my project is Laravel project。。。我有一个.htaccess文件,它会将所有文件重定向到/public文件夹,也许.htaceess文件会产生问题。我遵循了许多教程,但我不知道为什么会得到:remote:fatal:必须运行此操作
git init