如何忽略git中的跟踪文件而不删除它?

Liz*_*Liz 35 git ignore sourcetree

我的团队使用 sourcetree 作为我们的 git 客户端。我们的项目中有一个第三方插件。它需要几个配置文件。这些文件不能自动生成。它们存储帐户名、登录令牌和一些不应共享的临时选项。但是大家还是需要这个文件的,不然会报错。所以现在他们总是留在我们的“未提交的更改”部分,这很烦人。

我有两个选择:

  1. 从 git 存储库中删除这些文件。将它们添加到 .gitignore 中。要求我的所有团队成员使用自己的设置将这些文件添加回他们的本地项目。

  2. 看看是否有“忽略跟踪文件而不删除它”之类的技巧。

(基本上我觉得如果选项2可行,git应该有一些逻辑,例如“如果本地没有这个文件,使用远程版本。如果本地有这个文件,忽略”。逻辑感觉不好,容易产生错误。)

m4l*_*90n 35

这是你想要做的:

  1. 添加要从存储库中删除但在本地保留到.gitignore 的所有文件,单独或在文件夹中。
  2. 对每个文件执行git rm --cached put/here/your/file.extgit rm --cached folder/\*如果它们在文件夹中。(它是 /\* 因为你需要转义 *)
  3. 提交您的更改。
  4. 推到远程。

完成此操作后,您将有效地“忽略跟踪的文件而不删除它们”,将它们从存储库中删除并在您的系统中保持所有文件不变。然后,当您的团队拉取更改时,他们将拉取.gitignore文件,并且他们的个人配置文件不会被 repo 中的文件覆盖,因为您已忽略它们并从中删除它们。另外,因为现在新的.gitignore忽略了这些文件,每个人都会有自己的版本,不会在“未提交的更改”中显示。

  • 虽然这确实适用于已经在本地拥有该文件的开发人员,但您确实已经从 git 中删除了它,并且任何人在您提交 `git rm` 更改之后重新检出 repo 时,他们的工作副本中将没有该文件。 (6认同)
  • @ardila 的评论需要强调。一旦其他文件系统签出包含此更改的分支,这*将*删除其他文件系统上的文件。这正是OP试图避免的。 (3认同)
  • @ardila 这是真的。一个简单的补救措施是创建一个脚本,无论是 npm 还是 powershel 或其他任何东西,可以为 repo 的新用户运行一次并生成 gitignored 文件。或者,如果无法生成该 gitignored 文件,只需告诉他们如何手动设置该文件。 (2认同)

小智 32

似乎在这里找到了一个简单的解决方案。仅将文件/目录添加到 .gitignore 是不够的,但是 git 将允许您手动“忽略”对文件/目录的更改:

git update-index --assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)

如果您想再次开始跟踪更改,可以使用以下命令撤消之前的命令:

git update-index --no-assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)

要查看禁用更改跟踪的文件,您可以使用(linux/unix):

git ls-files -v | grep ^[h]
Run Code Online (Sandbox Code Playgroud)

或(窗口):

git ls-files -v | find "h "
Run Code Online (Sandbox Code Playgroud)

背景:我需要它来将包含用户数据的配置文件添加到存储库中。用户应该拉取该文件并为他/她的系统编辑它,但该文件随后应该被 git 忽略并且永远不会提交。

  • 请注意,所有想要修改文件的 git 用户都应该运行上面的命令。 (2认同)

Rus*_*usi 1

太长了;博士

\n\n
    \n
  • 从技术上讲,您的要求是矛盾的。

  • \n
  • 从更哲学的层面来看,它(似乎)是开源与企业哲学之间的冲突。

  • \n
  • 无论如何\xe2\x80\xa6我会建议一些我想到的东西

  • \n
\n\n

从技术上来说

\n\n

git跟踪或忽略文件。

\n\n
    \n
  • 跟踪很容易。除了使用 git 之外,什么都不做\xe2\x80\xa6!并且任何文件都会被跟踪。
  • \n
  • 忽略 \xe2\x80\x94 几乎同样简单,只需确保它与 gitignore 文件中的某些内容匹配即可。
  • \n
  • 但你不能两者兼得!
  • \n
  • 主要警告:将文件从跟踪移动到忽略有点不简单 \xe2\x80\x94 只需将合适的模式添加到 gitignore 就不会在跟踪后切断它。相关的
  • \n
\n\n

最佳实践

\n\n

不要在没有创建适当的项目的情况下启动 git 项目

\n\n
    \n
  • gitignore
    \n也相关
  • \n
  • git 属性
  • \n
\n\n

所以第一个(有点不现实)

\n\n

建议1

\n\n
    \n
  • 开始一个新的git项目
  • \n
  • 制作正确的 gitignore 和 gitattribute 文件
  • \n
  • 如有必要,使用git-check-ignore进行调试
  • \n
  • 复制、添加、提交您的普通文件
  • \n
  • 复制、添加、状态不被跟踪的文件。状态应该是干净的
  • \n
\n\n

但正如我所说,这似乎并不完全是您想要的,因为您确实想要某种共享但未跟踪的文件。\n所以您需要

\n\n

取消跟踪跟踪的文件

\n\n\n\n

你实际上想要一个 git

\n\n

克隆后挂钩

\n\n

这是在这里尝试的

\n\n

但这是一个坏主意,如此处所解释的

\n\n

这让我想到

\n\n

哲学差异

\n\n
    \n
  • 企业雇主有理由希望控制其员工程序员的职能/方式。这需要各种机器控制
  • \n
  • github 上的随机开源软件控制其他随机人的机器是不道德和非法的。
  • \n
\n\n

因此,如果您是财富 500 强玩家,自然的选择是分叉 git 本身,并在您的分叉中添加克隆后钩子功能

\n\n

更合理,只是稍微不方便

\n\n

解决方案2

\n\n
    \n
  • 编写您自己的克隆后但可手动调用的脚本
  • \n
  • \xe2\x80\xa6 如果不存在则满足复制要求,如果存在则无需保留
  • \n
  • 并向您的团队添加(手动)步骤:(1) 克隆 (2) 调用脚本
  • \n
  • 并且不要忘记 gitignore!
  • \n
\n\n
\n\n

如果这个解决方案有意义,您可能实际上更喜欢

\n\n

解决方案3

\n\n

将script-inside-git反转为git-inside-script

\n\n

即要求您的团队仅下载/复制并运行一个脚本

\n\n
    \n
  • 跑步git clone
  • \n
  • 检查这些其他文件的存在/适当性
  • \n
  • 如有必要,创建/下载它们(可能来自独立于您的主存储库的来源)
  • \n
\n