两个本地响应之间的git推送错误

两个本地响应之间的git推送错误,git,version-control,git-push,Git,Version Control,Git Push,我有一个带有目录的(主)文件夹“prj”,并且有git init在那里创建了一个repo,并用git add*添加和提交了所有文件 我已经创建了另一个目录“prj2”,其中包含git init,然后执行git pull,将所有内容复制到“prj2” 现在,当我对prj2 repo和commit中的文件进行更改时,然后对prj(main)执行git push,它会给出错误: 远程:错误:拒绝更新签出分支: refs/heads/master[K remote:错误:默认情况下,更新当前 非裸存储库

我有一个带有目录的(主)文件夹“prj”,并且有
git init
在那里创建了一个repo,并用
git add*添加和提交了所有文件

我已经创建了另一个目录“prj2”,其中包含
git init
,然后执行
git pull
,将所有内容复制到“prj2”

现在,当我对prj2 repo和commit中的文件进行更改时,然后对prj(main)执行
git push
,它会给出错误:

远程:错误:拒绝更新签出分支: refs/heads/master[K remote:错误:默认情况下,更新当前 非裸存储库中的分支[K remote:error:被拒绝,因为它 将使索引和工作树不一致[K remote:错误:与 您推动的,并将需要'git r

这是设置主项目(prj)和第二个(prj2)的正确方法吗?我可以从这两个项目推送到主项目

如果因为主项目回购是非裸git init..等而无法推送,那么应该如何推送主回购


或者另一种设置更好吗?

更简单的方法是克隆主项目并将其配置为
远程项目。它是本地的这一事实不是问题

换句话说,不是
init
ing两个回购,而是
init--bare
one然后克隆它

或者,如果它们都需要一个工作副本(即非裸副本),则只有当两个回购协议不同时在同一分支中时,您才能使其工作。如果它们在同一分支中,则意味着当prj2推动其更改时,prj1的工作副本将变为无效(这基本上就是您得到该错误的原因)


最后,如果您需要在同一个分支中,那么git是一个错误的工具,因为您更多地是在谈论镜像。在这种情况下,类似于
rsync
的东西会更好地工作错误:拒绝更新签出分支:refs/heads/master 这是我第一次犯的错误之一

我已经了解到,这可能是由于分支处于非裸状态。如果有人向该分支推进,它将覆盖已签出副本的现有状态

如果我没记错的话,一般的方法是使用裸存储库,这是通过以下方式完成的:

git init --bare
另一种可能性是使用分支


查看一下可能会很有用,这在当时对我很有帮助。

如果您打算在两个repo中都工作,那么我发现从prj1中提取prj2是最干净的解决方案,而不是试图将prj2推送到prj1中。如果prj1是从第三个(可能是远程)存储库克隆的,那么您仍然可以像往常一样推送到第三个(远程)存储库如果使用此设置,则从prj1回购


如果您不打算在prj1中工作,而它只是一个中心聚合点,那么按照其他人的指示设置一个裸存储库可能是最好的。

我现在克隆了prj(main)在一个新的空prj2目录中,做了一些更改,提交并尝试了“git push origin master”,它给出了相同的错误抱歉。我没有注意到您的第一次回购不是空的。这是一个要求吗?您需要有两个工作副本吗?如果是的话,当您从prj2推送相同的分支时,您期望prj1的工作副本会发生什么情况?因为这是您遇到的问题。一个解决方案是确保两个工作副本不同时在同一分支中是的,没有必要有两个工作副本,因此我确实将第一个prj回购更改为裸,然后推送工作。但是,在推送到的回购中打开推送文件时,这些更改很明显?然而,它确实在“git log”中显示了提交。你是说在裸机repo中打开推送的文件吗?好吧,这是不可能的,但是如果我错了,有人会纠正我。但是,你可以在裸机repo中运行git命令,这样你就可以执行例如
git log
的操作,你会看到从非裸机repo中推送的提交。哦,是的,所以如果我如果推送文件在主项目文件夹中不可访问或更改,那么推送到另一个repo的目的是什么?我的印象是“git init--bare”在非空目录下不起作用,但它似乎起作用!但是这些更改没有反映在主bare repo中。当我打开假定的更改的文件没有推送到其中的更新内容?运行“git log”会显示提交