如何接受git远程存储库上推送的更改?

问题描述:

我有git从我的web服务器克隆了我的git远程仓库到我的本地机器上。在我的本地机器上进行更改后,我已经提交并使用git远程存储库将更改推送到Web服务器,并且在运行git状态时发现有更改。但是我能想到实现这个变化的唯一方法就是运行git stash。我相信这是不正确的方法。我尝试了git fetch和git merge,但是这是远程资源库,我试图用生产中的其他更改进行更新。如何接受git远程存储库上推送的更改?

git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: test.txt 
# 

git stash 
Saved working directory and index state WIP on master: eb8230d Changes 
HEAD is now at eb8230d Changes 
+0

接受变更是什么意思?你的意思是'git pull'? git'stash'表示临时分离当前状态,例如,如果您有一些工作正在进行并且必须切换分支 – MorKadosh 2015-04-02 15:07:06

+0

实施推送到远程存储库的更改。如果我cat test.txt,它仍然是旧的,原始文件。我不知道这是否回答你的问题。 – imparante 2015-04-02 15:08:29

+0

[Git Post-Receive Hook for Website Staging]的可能重复(http://*.com/questions/3838727/git-post-receive-hook-for-website-staging) – Charlie 2015-04-02 15:13:35

我猜你的意思是远程存储库有一个工作目录是一个实时网站。您希望将更改推送到远程存储库并将更改自动应用到工作目录(即实时网站),从而将更改部署到您的网站。

你想要做的就是设置一个远程仓库和一个post-receive钩子来检查新文件。

Git的默认设置是假设工作目录中的更改很重要,不应该轻易被吹掉。这是因为默认设计是为了使工作目录成为用户正在工作的实际目录,进行更改等。对于充当实时网站的存储库,此假设不成立,因此默认行为不会工作得很好。

特别是,推送到远程存储库将更新分支和该存储库上的git索引,但不会对工作目录进行任何更改。这使得它看起来好像在你的工作目录中有变化,它只是撤消刚推出的任何工作。

您可以使用已找到的命令git checkout --force并将其放入post-receive挂钩中,并且每次推送更改时,存储库都会检出新文件。这会消除工作目录中的任何更改,但推测这些“更改”永远不会是除了推送的更改之外的假更改。如果您曾在远程存储库的工作目录中手动编辑任何内容,则可能会失去这些编辑。


另一种选择是让库您的Web服务器是一个--bare库,远程存储库通常应该是。不要让工作目录也用作实时网站,而是使用post-receive hook脚本运行命令将网站部署到另一个位置。

http://krisjordan.com/essays/setting-up-push-to-deploy-with-git

+0

这正是我所掌握的。没有意识到这个命令吹动了Web服务器的变化。开发人员将更改推送到远程存储库,即Web服务器。我可能本应该做一个git init --bare,因为该计划只接受来自开发人员的更改。在阅读该链接之前,对裸露的存储库不太熟悉。谢谢!我们仍然在让每个人都使用git,而不是在制作网站上开发,但到目前为止这么好! – imparante 2015-04-04 21:23:55

您将需要让您的远程web服务器从正在跟踪的分支中提取最新的提交。这是用git checkout(branchname)和git pull(在正确的分支上一次)手动完成的。

你可以编写一个cronjob来定期尝试一个git pull,或者为你的仓库设置钩子。这会在每次将提交推送到回购站时向远程Web服务器发送消息。

我通过使用Jenkins服务器和ssh-command插件来SSH解决了这个问题,并执行了git pull。

另一种解决方案是将您的网络服务器添加为另一个远程。你可以通过键入做到这一点:

git remote add webserver ssh://<your user name>@<FQDN>:22/path/to/repo.git 
git push webserver <branch> 
+0

我不确定它是否不正确,但我没有直接创建分支并对文件进行修改,并执行git commit和git push。 – imparante 2015-04-02 15:33:23

+1

这是一种正确的做事方式,只要您将新分支合并回您的主分支。你可以用git merge 来做到这一点。或者,你可以使用一个git前端,如SourceTree来自Atlassian – 2015-04-02 15:37:39

看起来像我需要运行

git checkout -f 

到Web服务器更新到分支或变更的头。