我提交的文件去哪儿了?

Posted

技术标签:

【中文标题】我提交的文件去哪儿了?【英文标题】:Where did my committed file go? 【发布时间】:2009-08-08 18:25:27 【问题描述】:

我正在尝试学习如何使用颠覆。在我的 mac os x 服务器上,我有:

~/public_html(很多文件)

我也有/var/svn/myproject(这是我使用svnadmin的svn目录~/public_html /var/svn/myproject)

在我的 MacBook Pro 上,我使用了 svn checkout svn checkout svn://myserver/mysvnpath

它检查文件。

我编辑一个文件并放入一些简单的东西。

我提交,它没有给出任何错误,并说我处于修订版 2。

我的问题:

当我提交更新的文件时,它在服务器上的什么位置?我从来没有看到它在 ~/public_html 中改变过。

我的更新文件在服务器上的什么位置?我查看了修订文件,我可以看到 revs 中的 2 有我的更改(只是添加了一行,phpinfo();)。

感谢您的帮助。

编辑:基于 cmets 我可以看到我真的不明白。

编辑:我在 ~/public_html 中尝试了 svn update,但我的 index.php 文件从未更改。有趣的是,我有另一台机器,我检查了代码,它显示了新版本 (2)。我只是无法将它放回 ~/public_html。如果我必须手动将其复制回 ~/public_html 那么我如何确定正在使用最新版本。此时存储库有什么好处?我知道它会跟踪更改,但如果我更新服务器上的 web 目录,我希望它推出最新版本。

【问题讨论】:

版本控制系统不是软件分发系统。 【参考方案1】:

我认为这个 SVN 常见问题解答条目会对您有所帮助:“I'm managing a website in my repository. How can I make the live site automatically update after every commit?”:

这是一直在做的,并且是 通过添加一个很容易实现 提交后挂钩脚本到您的 存储库。阅读钩子脚本 本书第 5 章。基本思想 就是让“现场”只是一个 普通的工作副本,然后有 你的提交后挂钩脚本运行'svn 更新”。

在实践中,有几个 需要注意的事情。服务器 执行提交的程序 (svnserve 或 apache) 是一样的 将运行的程序 提交后挂钩脚本。这意味着 该程序必须具有适当的 更新工作的权限 复制。换句话说,工作副本 必须由同一用户拥有 svnserve 或 apache 运行为 -- 或 at 至少工作副本必须有 适当的权限集。

如果服务器需要更新一个 它不拥有的工作副本(对于 例如,用户 joe 的 ~/public_html/ 区域),一种技术是创建一个 +s 运行更新的二进制程序, 因为 Unix 不允许脚本运行 +s。编译一个微型 C 程序:

#include <stddef.h>
#include <stdlib.h>
#include <unistd.h> 
int main(void) 

   execl("/usr/local/bin/svn", "svn", "update", "/home/joe/public_html/",
         (const char *) NULL);  
   return(EXIT_FAILURE);

... 然后 chmod +s 二进制文件,然后 确保它归用户“joe”所有。 然后在 post-commit 钩子中,添加一个 运行二进制文件的行。

如果您在获取钩子时遇到问题 要工作,请参阅“为什么不是我的存储库 挂钩工作吗?”。

此外,您可能希望阻止 apache 导出 .svn/ 实时工作副本中的目录。 将此添加到您的 httpd.conf:

# Disallow browsing of Subversion working copy administrative dirs.
<DirectoryMatch "^/.*/\.svn/">
Order deny,allow
Deny from all 


另一种选择:您可以使用就地导入。看看here 怎么做。

【讨论】:

有一个 &lt;/DirectoryMatch&gt; 关闭 de &lt;/DirectoryMatch&gt; 但 wmd 非常喜欢它并且它消失了。 :-|【参考方案2】:

同样的困惑我见过不少。

您的 SVN(如果是 SVN 服务器)(/var/svn/myproject) 和您的网络服务器 (~/public_html) 是完全独立的,彼此没有任何关系。您需要将文件保存/上传到 ~/public_html 文件夹并提交到 SVN(服务器)。一个是webserver,另一个是SVN(服务器)。

我工作时使用的一般流程是:

    将存储库签出到本地文件夹(不是网络服务器目录,因为您不希望人们能够访问 .svn 文件夹)。 编辑必要的文件。 将文件从工作目录上传、保存或复制到 Web 服务器。测试以确保它有效。 (某些编辑器,例如 Dreamweaver 或 PhpEd 可以一键保存到您的工作目录和网络服务器目录(FTP 或其他)。) 一旦您对更改感到满意,请使用您的 SVN 提交流程将更改放入 SVN。

每次进行一组更改时都重复一次,结帐除外,如果您在其他地方或其他人做过的更改,您需要进行更新。 (每次我处理一组特定的更改或网站的错误时,我都会执行此过程,以便我可以跟踪我为每次更改所做的历史记录。)

SVN(服务器)仅用于跟踪更改。它通常作为 webserver 的一个模块运行,但与您的实际 webserer 无关。

如果您对它的工作原理感到困惑,我建议您购买 SVN 服务,这样您就不会感到困惑,他们会处理 SVN 的设置及其相关问题。

编辑如果您希望它自动将您从未发布过的版本发布到网络服务器(不推荐),那么您需要创建一个脚本以每 15 分钟左右更新一次。这真的很糟糕,因为您的 .svn 文件夹最终会出现在 webserver 目录中。每次进行更改或将 svn 导出到该目录时,您都需要手动执行此操作。

【讨论】:

所以SVN真的没有拿到文件?它只跟踪更改。那是对的吗?而且我必须将新文件从我的mac复制到服务器?你是对的。我有一个很大的误解。 你能评论下所有那些说要在 ~/public_html 上使用 svn update 的人吗?那是错的吗?它对我不起作用,但一样。应该吗? 如果您要这样做(正如我所说,这是个坏主意),您需要先清空 public_html 文件夹,然后再结帐。 所以,如果我想做我所说的,那么我会转储 public_html,将我的源代码放在其他地方,然后在我的 apache 指向的 public_html 中结帐。但这很糟糕,对吗?不过我真的不明白重点。如果我有 10 个人在处理 index.php,如果我手动执行,我怎么知道应该将哪个版本放入 ~/public_html?顺便说一句,不要争论,只是想理解。感谢您的帮助。【参考方案3】:

您还需要在 ~/public_html 上运行 svn update。

我相信 ~/public_html 是第 1 版,而你的 macbook 是第 2 版。

【讨论】:

【参考方案4】:

Rev 2 文件将在 /var/svn/myproject 中更新。为了使更改也反映在 ~/public_html 中,您需要对该目录执行 SVN 更新,因为它不会自动执行此操作,并且至少在您更新它之前仍处于修订版 1。您可以使用 cronjob 自动执行此过程,我相信有一种方法可以检测何时有新的 SVN 提交,但我不知道它是否/是什么。

【讨论】:

【参考方案5】:

您正在尝试解决 2 个过程:

    如何管理处理同一源代码的不同人员。你已经为此设置了一个颠覆服务器;开发人员在他们的本地机器上检查代码并提交他们的更改。

    将更改部署到实时站点。有几种方法可以实现这一点,具体取决于您需要内置到系统中的质量保证级别、必须部署更改的速度……无论如何,最好的做法是建立一个适当的程序用于部署。这可以通过将您的 Web 服务器的 public_html 目录作为工作副本并在那里运行“svn update”来完成(手动、计划或从提交后挂钩触发)。但是,我会在一个真正的部署脚本(使用 msbuild、nant、简单的 .bat 文件,无论哪个适合您)上投入更多时间,该脚本导出源(使用“svn export”)并将它们放在正确的位置。

【讨论】:

以上是关于我提交的文件去哪儿了?的主要内容,如果未能解决你的问题,请参考以下文章

去哪儿网怎么沦为骗子的平台了,一步步揭开去哪儿网欺骗消费者的把戏

从 sonar-runner 迁移到 MSBuild Runner。 sonar-project.properties 文件去哪儿了?

Remix Ethereum 合约去哪儿了?

codeigniter:实体去哪儿了?

在 Windows 中简单的 .wav 或 .mp3 播放 - 它去哪儿了?

.bss vs COMMON:啥去哪儿了?