我是git的新手,没有任何版本控制系统的经验。我在本地进行开发,正在寻找一种比FTP更简单的方法来将文件部署到(LAMP)Web服务器。我很难配置Git(适用于Windows的2.5版)在推送更改时自动更新其当前的工作目录。创建本地存储库,执行首次提交并在别名下添加远程位置后,这就是我要做的事情origin:
ssh user@domaincd testgitgit initgit config receive.denyCurrentBranch updateInsteadgit status:无须提交exit git status:未添加任何内容,但存在未跟踪的文件git push origin master步骤8产生一个通知和两个错误:
stdin: is not a ttyfatal: bad config value for 'receive.denycurrentbranch' in configfatal: Could not read from remote repository我一直在环顾四周,但被困住了。我究竟做错了什么?
我有一个feature分支和一个testing分支(用于初始回归).我想testing为测试环境提供一个可用于我的分支的工作副本.但是,我需要通过脚本压缩一些源代码(不是二进制,只是优化).我可以通过post-receive Git钩子来制作这个脚本.
我正在尝试设计我的bash脚本(用于CI),因此它非常强大,并希望避免自动化导致Git冲突.我正在考虑拥有一个主存储库(origin)和一个测试环境存储库(ci_test),只是为了允许CI提交.
我正在考虑ci_test/testing推广来源.origin/testing如果需要,CI应该压缩,添加,提交,获取,合并(将其完全iff冲突),然后推送到origin/testing.
我上面的模型的问题是,当我尝试推送时,Git会抱怨,ci_test/testing因为它有一个工作副本(有意义,因为它们可能无法同步).有没有一种适当的(自动化)方法来使用Git的持续集成脚本,以便它们仍然被跟踪?
我对我创建的场景很困惑.我在Github上创建了一个存储库(让我们称之为A)并将代码推送到它.之后,我将该存储库克隆到我的本地(让我们称之为B),这样我本地的来源就是远程回购A.
现在我从我的本地B克隆来创建另一个本地实例C.现在我有远程起源的C作为repo B而C的上游是A.
A ? B ? C
Run Code Online (Sandbox Code Playgroud)
这类似于分叉,但在这里我在客户端而不是服务器端创建了克隆.
现在,如果我尝试使用从C到其原点B的推送:
git push origin
Run Code Online (Sandbox Code Playgroud)
然后我收到一个错误,指出我无法推送到非裸存储库.我知道推送到非裸存储库可能会导致本地远程不存在的提交丢失.
但是,这种情况与我将代码从B推送到A的情况类似吗?
我很困惑,如果B到A是可能的,那么为什么C到B.
为了合并到A,我们可以推送到上游:
git push upstream
Run Code Online (Sandbox Code Playgroud) 我的设置如下:
我在Mac上运行git版本2.3.2(Apple Git-55)。这有一个非裸露的git仓库,位于~/xyz。
然后,我在同一台Mac上使用VMWare Fusion运行Windows 7 64bit。VM具有git 1.9.5,这是Windows的最新git版本。从VM中,我可以克隆并从Mac的非裸仓库中拉出~/xyzOK,但是我不能将其推入。我遵循了这里的建议并继续使用receive.denycurrentbranch=ignore,~/xyz但仍然给我相同的错误消息:
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 …Run Code Online (Sandbox Code Playgroud) 当您推送到远程存储库的已签出分支时,通常会收到警告,而Git将不允许您这样做。
但是我暗示git可以将Loeliger的2ed版本从带有Git的Version Control中推送到远程存储库的当前分支,尤其是粗体文本:
推送操作可以更新存储库状态,包括HEAD commit。也就是说,即使远端的开发人员什么也没做,分支引用和HEAD可能会更改,与检出的文件和索引不同步。
积极在发生异步推送的存储库中工作的开发人员将看不到该推送。但是该开发人员的后续提交将发生在意外的HEAD上,从而产生了奇怪的历史记录。强制推送将丢失其他开发人员的推送提交。该存储库中的开发人员还可能发现自己无法与上游存储库或下游克隆协调其历史记录,因为它们不再像应有的那样简单快速。她也不知道为什么:存储库已经从她下面悄悄地更改了。猫和狗将生活在一起。不好
因此,鼓励您仅将其推送到裸仓库中。这不是一成不变的规则,但这对普通开发人员来说是一个很好的指南,被认为是最佳实践。在一些实例和用例中,您可能希望将其推送到开发存储库中,但是您应该完全理解其含义。当您确实要推送到开发存储库时,您可能需要遵循两种基本方法之一。
在第一种情况下,您确实确实希望在接收存储库中有一个工作目录,其中包含一个已检出的分支。例如,您可能知道,没有其他开发人员在那里进行过积极的开发,因此,没有人会因为无声更改被推入其存储库而盲目地站在一边。
在这种情况下,您可能希望在接收存储库中启用一个钩子,以对某个分支(也可能是刚刚推送的分支)执行检入操作。为了在自动检出之前验证接收存储库处于健全状态,挂钩应确保非裸存储库的工作目录不包含任何编辑或修改的文件,并且在推入时其索引中没有处于暂存但未提交状态的文件发生。如果不满足这些条件,则可能会因结帐覆盖而丢失这些编辑或更改的风险。
在另一种情况下,推送到裸机存储库也可以很好地工作。根据协议,每个推送更改的开发人员都必须推送到未签出的分支,该分支仅被视为接收分支。开发人员从不推送到期望被检出的分支。特别是由某些开发人员来管理签出哪个分支以及何时签出。也许那个人负责处理接收分支并将它们合并到主分支,然后再签出。
是否暗示git可以推送到远程存储库的当前分支?(我的猜测是,但是我不确定)
最后一段之前的段落(该段落建议使用钩子来检出通过push更新的分支)是否假定要推送到的分支不是远程存储库中的当前分支?(我的想法是,签出要推送到的分支暗含了要推送到的分支不是当前分支,但是最后一段指出了推送到非签出分支的“不同情况”,这对我意味着上一段是关于推送到已签出分支(即当前分支)的信息
有2个git存储库,A和B.
两者都只有一个主分支,并且都在本地检出并正在处理.
我从A推进B的主分支,我收到这条消息:
warning: updating the current branch
warning: Updating the currently checked out branch may cause confusion,
warning: as the index and work tree do not reflect changes that are in HEAD.
warning: As a result, you may see the changes you just pushed into it
warning: reverted when you run 'git diff' over there, and you may want
warning: to run 'git reset --hard' before starting to work to recover.
warning:
warning: You can set 'receive.denyCurrentBranch' configuration variable …Run Code Online (Sandbox Code Playgroud) 有可能有一个git存储库(clonable和pushable)本身就是另一个远程repo的克隆?
场景:
我们为我们公司的git托管安装了一个gitorious.我们希望保持更新,但添加一些非常私有的功能(主要是部署脚本),因此需要一个可推送的项目.所需的工作流程将是:
PS.由于这些部署脚本非常敏感,因此我不能简单地在功能上进行公共克隆并使用它.