使用 Git 将文件标记为“不可提交”

Ada*_*ter 44 git github

我想通过将它们上传到我的 GitHub 帐户来炫耀我的一些工作。但是,有些文件包含密码,例如数据库连接。

有没有办法用 Git 将文件标记为不可提交,使其无法出现在 GitHub 上?

Gia*_*968 68

有没有办法用 Git 将文件标记为不可提交,使其无法出现在 GitHub 上?

首先,无法让某些文件和提交在本地 Git 存储库中可见,但在 GitHub 中无法查看;如果您在 Git 中提交了一个文件,它将显示在 GitHub 中。

其次,没有简单实用的方法可以将单个文件本身标记为“不可提交”。但是肯定有一种方法可以忽略 Git 存储库中的文件:通过将文件(如果需要,包括它们的相对路径)添加到.gitignore文件中

一个.gitignore文件指定故意未跟踪文件的Git应该忽略。已经被 Git 跟踪的文件不受影响;有关详细信息,请参阅下面的注释。

创建基本文件.gitignore相当容易,因为它只是一个纯文本文件。所以——例如——如果我config.php在你的根目录中有一个文件,你会这样做;假设您使用的是 PHP,但该概念适用于任何设置。此外,我在这个例子中使用 Nano 作为我的文本编辑器,但可以随意使用您通常用于此的任何文本编辑器:

nano .gitignore
Run Code Online (Sandbox Code Playgroud)

只需将该文件名添加到该文件中:

config.php
Run Code Online (Sandbox Code Playgroud)

保存它,现在 Git 将简单地忽略该文件。

也就是说,我喜欢为这样的设置做的是在存储库中保留一个样本/示例配置中的敏感细节,所以我有一些关于配置文件格式是什么文件的参考,如下所示:

config.SAMPLE.php
Run Code Online (Sandbox Code Playgroud)

这样你就可以确切地知道config.php应该如何设置文件,config.SAMPLE.php并且可以确保config.phpGit 永远不会触及实际文件。

此外,如果您打算炫耀您的代码,您需要期望有人会尝试采用该代码并以某种方式在他们自己的系统上实现它。请记住,我们不是您,如果您的 repo 中没有示例配置文件,人们将不会真正了解如何自己实现代码。哎呀,他们甚至可能认为您不称职,因为您没有提供基本的配置示例。

  • +1 为正确答案 * 和 * 建议示例配置文件。有一些像 [Figaro](https://github.com/laserlemon/figaro) 的 Ruby 库会在这个方向上推动你。您应该提交一个示例文件,其值与实际值相似,以便查看代码的人知道环境应该是什么样子。某些平台,如 Heroku,使用环境变量,因此您可以将配置设置为诸如 `database_url = Environment.DATABASE_URL` 之类的内容,并在上面留下评论,如 `# postgres://username:password@localhost/dbname`。 (11认同)

Juh*_*man 32

您还可以添加一个预提交钩子来实现健全性检查。.git/hooks每个 git 存储库的目录都有一些示例脚本。

pre-commit如果调用的脚本在每次提交之前存在,则执行该脚本,并且非零返回值中止提交。

例如,你可以有一个像这样的简单脚本:

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0
Run Code Online (Sandbox Code Playgroud)

如果filename匹配,则提交失败。

  • +1 这是正确的答案,实际上可以防止显式添加和提交文件。 (3认同)
  • @R .. 是和否。虽然问题指出,“将文件标记为不可提交”,但精神是“防止文件被提交”。事实上,对于任何使用 Git 的人来说,创建 `.gitignore` 是非常普遍且普遍理解的做法。但是大多数 Git 用户并没有真正使用预提交脚本。它需要一些设置知识,并且需要一些真正的原因,为什么这样的方法比简单地使用“.gitignore”文件更可取。但这对于一些更复杂的情况非常有用,但是当您真正知道需要使用它时,这绝对是您会使用的概念。 (3认同)
  • 我可以看到在您可能不是 100% 信任 .gitignore 的情况下使用它(您可能会不小心做一些愚蠢的事情,要求 git add 提交文件)。或者其他人可能会编辑 .gitignore 文件(毕竟它受版本控制)。如果你真的需要一个可测试的过程,你可以在这样的过程中工作。 (3认同)
  • @CortAmmon 这并不总是与信任有关。您可以将一些您不想提交的_临时_和_非公开_调试信息添加到您的源代码中,但您不能忽略此类文件。相反,您想在提交之前检查它是否不包含任何_非法_内容。对于这个用例来说,这看起来是一个很好的解决方案。事实上,这就是我发现这个问题的方式,因为这是我的用例。 (2认同)

phk*_*phk 12

@JakeGould 说什么。在某些情况下,您还可以使用特殊的文件位,例如skip-worktreeassume-unchanged可以通过以下方式设置;有关两者之间的差异,请参阅此堆栈溢出答案

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

这将隐藏对现有文件的其他更改,如果您真的希望在每次拉取后都有一个文件,您可以使用它。但我建议你只有在你真正知道自己在做什么的情况下才使用它。


46a*_*nd2 8

使用.gitignore像@JakeGould 所说的那样。另外,一些相关信息:

  • .gitignore防止文件被跟踪;如果它们已经被跟踪使用git rm --cached来删除它们
  • 文件/模式$GIT_DIR/info/exclude也将被忽略
  • 用户的 core.excludesFile 指定的文件中的文件/模式~/.gitconfig也将被忽略。

有关更多详细信息,请参阅官方 Git 文档