【问题标题】:Is it possible to stop tracking files in the git repo, but have them remain in all remote checkouts?是否可以在 git repo 中停止跟踪文件,但让它们保留在所有远程结帐中?
【发布时间】:2014-04-14 04:00:19
【问题描述】:

我不小心在我的仓库中添加了一个第三方库并将更改推送到实时服务器,这是一个带有 post-receive 挂钩的裸仓库,可以将 master 分支签出到 webroot 中。

我想停止跟踪本地 repo 中的文件,将它们添加到 .gitignore,然后将我的更改推送到实时服务器,而不从实时服务器中删除文件。我仍然需要实时服务器上的那个库,只是不受版本控制管理。我希望能够对实时服务器上的库进行更改(除了所有最佳实践),而不会在每次推送时被 git repo 中的版本覆盖。

这可能吗?我已经用其他 repos 尝试过,它总是被删除。

【问题讨论】:

    标签: git deployment git-push git-remote


    【解决方案1】:

    .gitignore 文件将完全忽略该文件 - 因此它不会被跟踪,也不会成为存储库的一部分。您可以使用带有--assume-unchanged 标志的git-update-index 忽略对跟踪文件的更改。

    git update-index --assume-unchanged <path>
    

    --assume-unchanged 参数允许您在本地进行更改,而无需签入或推送它们。但是,这不会防止文件被结帐覆盖。为防止这种情况,您应该改用以下标志。

    git update-index --skip-worktree <path>
    

    其中任何一个都只会影响本地存储库。您假设的路径将保持不变,或者应该跳过它的事实不能被推送到任何远程 - 将其视为本地配置。

    然而,正如我经常提到的这类事情,真正的答案是停止使用 git 作为部署工具。有很多工具可以比 git 更轻松地处理部署。 (capistrano、phing、ant 等)

    【讨论】:

    • 我听说你在使用实际的部署工具,但在这件事上我并不总是有选择的余地。我正在尝试与已经以这种方式设置并希望能够在不从服务器中删除文件的情况下取消跟踪文件的人合作,因为它会破坏站点。不幸的是, git update-index 和添加到 .gitignore 没有帮助。文件仍在 repo 中,因此服务器上的 post-receive 钩子运行 git checkout master 并且库被 repo 版本覆盖。
    • 哦,我想我当时误解了。您根本不想要存储库中的文件吗?您只想要“本地”机器上的文件,但未跟踪。正确的?如果这是您的要求,我将重写我的答案,因为我误解了。
    • 顺便说一句,我完全明白您并不总是可以控制项目中使用的流程。我说的是我所做的,希望您牢记这一点,如果您长期参与该项目,您可能想尝试影响其在未来的完成方式。
    • 对,我认为没有办法做到这一点,因此提出了这个问题。 :) 我想从 repo 中完全删除该文件,但我不希望它从任何结帐的工作副本中删除。我基本上希望它变成一个未跟踪的文件,以便下次我将本地推送到远程时,远程仓库(带有运行git checkout master 的 post-receive 挂钩的裸仓库)不会丢失现在未跟踪的文件这将破坏现场。如果文件“始终”未被跟踪,则结帐不会打扰它们,但如果我 git rm --cached 或 update-index 它们会被删除。
    • 好吧,你告诉我的事情有点复杂。有问题的文件在回购中正确吗?您希望人们克隆 repo,并拥有该文件的一些通用或默认版本。您想要进行更改,但不必推送它们,并且当其他人做出他们确实推送的更改时,您不希望这些更改在拉取/结帐期间覆盖您的更改。这与我之前问的不同,因为在这种情况下,文件确实存在于远程的 git repo 中。
    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2013-09-06
    • 2018-02-18
    • 2016-06-24
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多