【问题标题】:git deployment: untracked working tree files overwritten by mergegit部署:合并覆盖的未跟踪工作树文件
【发布时间】:2013-04-10 21:43:02
【问题描述】:

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

  • 一个裸仓库,您在其中推送“中心”
  • Web 服务器公共目录中的普通存储库,您可以从“集线器”中提取。如果集线器有一个 适当的更新后挂钩。

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

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

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

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

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

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

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

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

【问题讨论】:

  • git rm --cached 只从索引中删除文件,这意味着接下来要提交的内容。它实际上并没有删除文件,也没有将它们标记为在下一次提交中删除。只有当你完成了git add upload/*(并且没有提交)它才会做一些事情,否则它什么都不做。

标签: git deployment


【解决方案1】:

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

您需要做的是在新提交中消除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 不再在存储库中(从这次提交开始)。

【讨论】:

  • 哇,好洞察力,简单明了的解决方案!我没有考虑。非常感谢!
【解决方案2】:

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

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

如果您在 git rm 之前被 git 忽略,则必须将其从忽略中删除,或者直接将其删除 rm

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 2012-12-23
    • 2012-06-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2017-06-09
    • 2012-12-16
    • 2018-06-16
    相关资源
    最近更新 更多