一种非常常见的情况:
我们有一个裸存储库。
如果开发人员从本地计算机git push
到bare
repo,然后另一位开发人员git pull
他们就会更新应用程序的本地版本(包含文件)。
但是,当remote working tree
直接(由主持人或其他人)进行更改时,我们最终会在本地计算机上使用不同的文件版本,remote working tree
得到的总是过时的!
根据这个:
https://git.wiki.kernel.org/index.php/GitFaq#non-bare
推送操作始终是关于传播存储库历史记录 并更新引用,永远不会触及工作树文件。在 特别是,如果你推动更新在a中签出的分支 远程存储库不会更新工作树中的文件。
我不确定checked out in a remote repository
是什么意思。我没有让任何git checkout whatever
远程使用ssh切换分支(如果这意味着什么)。
无论如何,如果我们进行git push,就不会触及工作树文件。确定。
所以为了解决这个问题:
如果您确定自己在做什么,可以执行“git reset --hard” 你推到的那一方。请注意,这将失去您所做的所有更改 在那一侧,将工作树重置为最新版本 推压。
“git reset --hard”
我这样做了,但没有改变。它说:
HEAD is now at 45d948a Merge branch 'dev' of /home/blabla/private/repos/blabla_hub into dev
但没有任何改变。
1)如果工作树只是通过裸(无工作树)存储库推送和拉动,那么所有开发人员如何更新工作树? (文件在哪里通过?)
2)为什么我没有按预期更新remote working tree
?
我的问题清楚了吗?请指教。
更新
我正在使用开发和主分支。本地和远程,除此之外,我正在使用这个架构:
该系统的关键思想是该网站存在于服务器上 作为一对存储库;一个裸露的存储库和传统的存储库 包含实时站点的存储库。两个简单的Git钩子连接起来 对,自动推动和拉动它们之间的变化。
这两个存储库:
Hub is a bare repository. All other repositories will be cloned from this. Prime is a standard repository, the live web site is served from its working directory.
使用这对存储库非常简单灵活。远程克隆 使用ssh-access可以通过简单的git push来更新实时站点 毂。直接在服务器上编辑的任何文件都会立即进行镜像 在提交时进入Hub。
答案 0 :(得分:1)
根据我的理解,您至少有三个回购:local
,hub
和www/dev
。您使用local
repo进行工作(进行更改,提交并推送到hub
)。有时,www
工作树会被网络服务器修改。如果您希望在版本控制下保留这些更改,可以将它们提交到www/dev
repo,甚至将提交从www/dev
推送到hub
。 (您可以使用cron作业自动执行此操作。我建议使用git status
的输出来确定是否要进行提交。)
您的原始问题听起来好像www/dev
repo的工作副本与www/dev
repo本身不同步。在聊天中进一步讨论后,似乎www/dev
回购并非始终与hub
回购更新。您只需确保在必要时在git pull
repo中运行www/dev
(可能使用钩子或其他脚本)。