1

我正在尝试实现一个基于 git 的部署过程,例如http://danbarber.me/using-git-for-deployment/来部署 Web 应用程序。基本上它由实时服务器上的两个存储库组成:

  • 一个裸仓库,您在其中推送“集线器”
  • Web 服务器公共目录中的普通存储库,您从“集线器”中提取。如果集线器具有适当的更新后挂钩,则会自动执行此操作。

问题是在我的项目中,我有很多目录,例如 /upload/,其中包含开发期间的示例数据和网络服务器上的真实实时数据。

理想情况下,我想将 upload/ 文件夹保留在本地存储库中,但不将其拉到实时存储库中。现在,“部分”拉动它似乎是不可能的,不是吗?

因此,即使不是最佳解决方案(我无法在本地存储库中克隆示例数据),我也会尝试忽略这些文件夹,但是:

  • 我将 upload/ 文件夹添加到本地和实时存储库的 .gitignore 中。
  • 我用 git rm --cached upload/ 删除了它
  • 我将项目推到了裸露的“中心”仓库
  • 在我从集线器拉出的实时存储库中
  • 我收到错误:未跟踪的工作树文件将被合并覆盖...上传/xxx

在我看来,upload/ 文件夹仍然在某个地方......确实,在写这篇文章时,我看到从集线器克隆,文件夹 upload/ 也被克隆了!

唯一的解决方案是从所有项目历史记录中完全删除该文件夹,就像我在几个问题中看到的那样?

这是否会迫使在不同分支上工作的所有其他同事进行一些混乱的变基?

解释和掌握这一切可能很困难,但欢迎提出任何想法。

4

2 回答 2

2

你不需要做所有这些,假设你不想签出比你的分支负责人更旧的提交。

您需要做的是upload/*在新提交中消除,从那时起,任何看到新提交的人都不会看到该upload目录。

显然,您希望将upload/*文件备份到“集线器”任何会从中提取的克隆上,删除提交中的上传,然后将备份放回原处。现在数据存在于您的目录中,但 git 不会再跟踪它们了。

注意:如果您不备份,您将删除upload/*集线器上的数据(可通过签出较旧的提交来恢复)或从中提取的任何人(如果未跟踪,则 git 会出错,或者通过签出较旧的提交来恢复)跟踪)。不过,最好先备份它。


例子:

$ git init
$ mkdir upload
$ echo 'upload/*' > .gitignore
$ touch to_track upload/not_track
$ git add .gitignore to_track upload/not_track
$ git commit

现在您upload/not_track在存储库中。

$ cp upload/not_track ../backup
$ git rm upload/not_track
$ git commit
$ mv ../backup/not_track upload/

现在当前目录中的文件没有改变,但upload/not_track不再在存储库中(从这个提交开始)。

于 2013-04-10T13:36:19.783 回答
0

没有看到 git repo 很难确定,但你所描述的不应该发生。

您是否检查了文件夹中的隐藏文件(例如,其中的一个.gitignore file,或.DS_Store(Mac 文件夹浏览器缓存)或类似的?)。被忽略的文件不会被自动删除git rm

如果你在你之前被忽略了,git rm你将不得不将它从忽略中删除,或者直接删除rm它。

于 2013-04-10T13:37:11.623 回答