昨天,我发布了一个关于如何将Git存储库从我的一台机器克隆到另一台机器的问题,如何从另一台机器"克隆"?.
我现在能够成功地将Git存储库从我的源(192.168.1.2)克隆到我的目标(192.168.1.1).
但是,当我对文件,a git commit -a -m "test"和a 进行编辑时git push,我在目的地(192.168.1.1)上收到此错误:
git push
hap@192.168.1.2's password:
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: …Run Code Online (Sandbox Code Playgroud) 我已经解决了一些合并冲突,然后提交尝试推送我的更改并收到以下错误:
c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or …Run Code Online (Sandbox Code Playgroud) 我通常通过ssh(screen和vim)在远程服务器上工作,我有一个Git存储库.有时我不上网,所以我的笔记本电脑上有一个单独的存储库(从我的遥控器克隆).
但是,我无法从远程端的这个存储库中取出,因为我通常在防火墙后面,或者我没有公共IP.
我已经读过,我应该只是推到一个裸存储库.我应该如何将更改推送到远程存储库?
我正在尝试设置Git来暂存我的网站,以便我可以git pull让当前版本在本地工作,然后git push将更改推送到远程服务器.我已经设置它以便按照我想要的方式工作,但是在我推动之后,我必须手动运行git checkout -f或git reset --hard HEAD在远程服务器上运行.
我已经尝试将这些作为服务器上的post-receive挂钩添加到shell脚本中,但它似乎没有任何效果.我知道脚本正在运行,因为我在推送后看到"更改推送到服务器".这是post-receive钩子:
#!/bin/sh
git reset --hard HEAD
echo "Changes pushed to server."
Run Code Online (Sandbox Code Playgroud) 这是我到目前为止所做的,我会说这个程序适用于Ubuntu 9.10,它可能有不同版本的git.
server: mkdir ~/git
local: scp -r /../project name@url.com:~/git/
server: cd git
cd project
git init
git add .
git commit -a -m "initial"
local: git clone name@url.com:/../git/project /home/name/project
cd project
capify . (from the ruby gem capistrano)
git add .
git commit -a -m "capified"
git push
Run Code Online (Sandbox Code Playgroud)
当我尝试推出时,我收到此错误消息:
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the …Run Code Online (Sandbox Code Playgroud) 我有一个Git存储库.我克隆了存储库,可以提交我的本地更改.当我将更改推送到服务器时,它可以工作.
一旦我创建了一个分支,我就会检查分支,提交我的工作,然后检查主分支.然后我将我的本地更改合并到主分支中.当我尝试推送到服务器时,我得到以下异常:
Welcome to Git (version 1.7.11-preview20120620)
Run 'git help git' to display the help index.
Run 'git help <command>' to display help for specific commands.
$ git push origin master:master
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 13.68 KiB, done.
Total 8 (delta 2), reused 1 (delta 0)
Unpacking objects: 100% (8/8), done.
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, …Run Code Online (Sandbox Code Playgroud) 当我进行git推送时,我看到以下内容:
warning: updating the currently checked out branch; this may cause confusion,
as the index and working tree do not reflect changes that are now in HEAD.
Run Code Online (Sandbox Code Playgroud)
我用Google搜索了这条消息,我所能找到的只是一个git邮件列表讨论,作者试图确切地决定如何使这个消息更好地与我沟通真正的问题是什么.
我是怎么造成这种情况的,我该如何解决?
这可能已经得到了回答,但我没有找到一个好的答案.
我来自集中式存储库,例如SVN,通常您只执行检出,更新,提交,还原,合并等等.
Git让我发疯.有很多命令,但最难理解的是为什么很多东西都像他们一样工作.
根据"什么是裸git存储库?" :
使用创建的存储库
git init --bare称为裸存储库.它们的结构与工作目录略有不同.首先,它们不包含源文件的工作或签出副本.
...
创建的裸存储库git init --bare用于... 共享....开发人员将克隆共享裸仓库,在其仓库的工作副本中进行本地更改,然后回退到共享裸仓库以使其他用户可以使用其更改.
- Jon Saints,http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/
但是,从接受的答案"github存储库和git裸存储库之间有什么区别?" :
GitHub上的Git repos是裸的,就像你要推送到[sic]的任何远程仓库一样.
- VonC,https://stackoverflow.com/a/20855207
但是,在GitHub中有源文件.我可以看到他们.如果我创建一个裸存储库,则没有源文件,只有.git工作存储库目录的内容.
这怎么可能?我不明白什么?
您能举例说明为什么我需要一个裸存储库及其以这种方式工作的动机吗?
爱德华汤姆森的回答部分是我想知道的.不过,我会重新提出我的问题:
我发布了第一个链接状态("什么是裸git存储库?"):
它们[裸存储库]不包含源文件的工作或签出副本.
VonC的回答:
GitHub上的Git repos是裸的
两个陈述暗示
Github没有工作副本.
爱德华汤姆森说:
它会在您浏览数据时根据数据呈现网页 - 将数据直接从存储库中提取出来并输出到您的Web浏览器,而不是先将数据写入文件服务器上的磁盘
不知何故,裸存储库必须包含所有数据和源代码.如果没有,那么渲染任何东西都不是不可能的,因为我可以看到所有源代码更新(提交),所有分支(具有各自的源),回购的整个日志等.
存储库的整个数据是否始终位于.git目录(或裸存储库)中,以某种格式可以随时呈现所有文件?这是裸存储库的原因,而工作副本只在给定时间有文件吗?
在github存储库中,我们可以进行git push git pull操作,同时,我们可以通过Web UI提交到存储库.似乎github存储库同时作为裸存储库和工作存储库工作?
但是,在git bare repository中,我们无法将目录提交到存储库.
所以,我的问题是
github存储库和git裸存储库之间有什么区别?
另请参阅此相关问题,它有最新答案:https://stackoverflow.com/a/28262104/7918.
如何推送并自动更新我的非裸远程git存储库的工作副本?
在git之前,人们会说"这是不安全的",请让我解释为什么在我的情况下这会起作用.我有储存库foo在机器A和B.A碰巧是我的本地机器,B在超级计算网格上.项目通常是在A(通过一些测试)开发的,然后推送到B更多测试并向网格提交作业.两个存储库都有工作目录.库上都A和B是私有并且连接到我的用户帐户.
现在git flow就是这样的:
A ABB我宁愿省略第3步和第4步.那就是:我希望在推送时更新远程非裸存储库,如果更改A可以自动安全地合并(即:当合并是快进时,工作目录)在B干净).
第一个解决方案是删除存储库B并仅用于rsync同步代码,但这是不可取的,因为有时我会直接进行一些更改B,并且不希望轻易覆盖这些更改.
第二个灵魂就是安装这个补丁,它甚至被合并到mysysgit(但不是git).此补丁updateInstead为receive.denyCurrentBranchgit选项增加了价值.这是可行的,但我宁愿不在许多机器上修补git.
第三种解决方案(从这里取)将涉及有三个Git仓库:A,B',B.哪里B'是裸的,并使用钩子来同步A和B.这非常简单,但我猜有三个存储库可能会增加整个系统的脆弱性.
最后的解决方案将是优先的:即使用存储库B上的钩子自动将推送的更改合并到工作副本.每个人都说这样做是直截了当的,但我想我对git内部的了解是为了修补一些合理的东西.我在这方面做了一些工作,但没有任何实际工作.
我在找什么: