如何配置git在本地忽略某些文件?

Bjo*_*orn 1237 git ignore gitignore

我可以在本地忽略文件而不会污染其他人的全局git配置吗?我在我的git状态下没有跟踪文件是垃圾邮件,但我不想为我在本地分支机构中的每个小随机未跟踪文件提交git配置更改.

Jos*_*Lee 1689

相关的Git文档:

特定于特定存储库但不需要与其他相关存储库共享的模式(例如,存储在存储库内但特定于一个用户工作流的辅助文件)应该进入该$GIT_DIR/info/exclude文件.

.git/info/exclude文件具有与任何.gitignore文件相同的格式.另一种选择是设置core.excludesFile包含全局模式的文件的名称.

请注意,如果您已经有非分段更改,则必须在编辑ignore-patterns后运行以下命令:

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

注意事项$GIT_DIR:这是使用的符号遍布 git的手册只是为了表明路径git仓库.如果设置了环境变量,那么它将覆盖您所在的任何回购的位置,这可能不是您想要的.

  • 注意,确保在添加到排除文件后运行```git update-index --assume-unchanged [<file> ...]```.直到那时才会收到更改. (196认同)
  • 如果您已经对文件进行了更改并且现在希望忽略它,则只需要使用git update-index.如果您在进行更改之前更改排除,则没有必要. (37认同)
  • 我不需要运行'git update-index ...'来使更改生效,使用git 1.7.9.5. (28认同)
  • 根据http://stackoverflow.com/questions/23097368/git-ignore-vs-exclude-vs-assume-unchanged和http://stackoverflow.com/questions/13630849/git-difference-between-assume-unchanged-and -skip-worktree/13631525#13631525,``skip-worktree``可能比``assume-unchanged``更受欢迎. (16认同)
  • 虽然这会阻止文件在.gitignore等提交期间显示为已更改,但与忽略的文件不同,如果执行git reset --hard,文件仍将重置为repo版本. (13认同)
  • 这似乎不起作用.Git仍然看到了这些变化并要求我提交它们. (4认同)
  • 对于目录中的所有文件:`git update-index --assume-unchanged mydir /**/*.*` (2认同)
  • 当你'git pull`并且有一个与你在本地忽略的文件同名的文件时会发生什么? (2认同)
  • 请[不要以这种方式使用 `assume-unchanged`](https://public-inbox.org/git/xmqqy4z5go1y.fsf@gitster.dls.corp.google.com/):'Assume-unchanged 不应该是被滥用于忽略机制。它是“我知道我的文件系统操作很慢。**我会向 Git 保证我_不会_更改这些路径**......”特别是,它*不是*承诺......Git 将始终认为这些路径是未修改的——如果 Git 可以确定路径……已经更改而不会产生额外的 `lstat(2)` 成本,它保留报告路径 * 已* 被修改的权利(因此,`git commit -a` 可以自由提交该路径改变)。' (2认同)
  • 这对我不起作用。每当我尝试签出一个新分支时,我都会收到“错误:您对以下文件的本地更改将被签出:排除的文件覆盖”。 (2认同)

Flo*_*ser 422

更新:请考虑使用git update-index --skip-worktree [<file>...],谢谢@danShumway!请参阅Borealid对这两个选项的区别的解释.


老答案:

如果您需要忽略对跟踪文件的本地更改(我们对配置文件进行了本地修改),请使用git update-index --assume-unchanged [<file>...].

  • 要撤消它:`git update-index --no-assume-unchanged my-file.php` (74认同)
  • 只是为了澄清:假设 - 未更改的是跟踪文件(存在于repo中)... OP要求UNtracked文件,在这种情况下`.git/info/exclude`就是你想要的(以避免污染经常共享的文件)跟踪.gitignore) (18认同)
  • 请注意,我在$ GIT_DIR/info/exclude(例如,my-file.php)中添加了一个文件,然后必须运行```git update-index --assume-unchanged my-file.php```它开始被忽略了.谢谢你的提示! (8认同)
  • 根据http://stackoverflow.com/questions/23097368/git-ignore-vs-exclude-vs-assume-unchanged这被认为是不安全的,如果您不小心,您的文件仍可能被提交.它旨在作为性能辅助,而不是解决此问题的万无一失的解决方案. (7认同)
  • 在阅读你的**更新**之前,我赶紧去了`--assume-unchanged`.我解除了`--no-assume-unchanged`并且_then_做了`--skip-worktree` ...我明白了吗? (2认同)

pha*_*ann 151

将以下行添加到.gitconfig文件的[alias]部分

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用git ignore my_file忽略对本地文件git unignore my_file的更改,并停止忽略更改.git ignored列出被忽略的文件.

这个答案来自http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html.

  • 安装真实的外壳程序(例如Babun提供bash或zsh);)我知道您的感受,但是最近我从Windows切换到Linux,并且我再也不会使用cmd。 (3认同)

Emi*_*Sit 107

你有几个选择:

  • .gitignore在工作目录中保留一个脏的(或未提交的)文件(或使用topgit或其他一些此类补丁工具自动应用它).
  • 将exlude放在您的$GIT_DIR/info/exclude文件中,如果这是特定于一棵树.
  • 运行git config --global core.excludesfile ~/.gitignore并添加模式到您的~/.gitignore.如果要忽略所有树中的某些模式,则此选项适用.例如,我用它.pyc.pyo文件.

此外,如果适用,请确保使用模式而不是显式枚举文件.

  • 我认为你需要`git config --global`来全局设置选项. (10认同)
  • 实际上,只需将.gitignore添加到.gitignore;)! (7认同)

Pio*_*aga 53

我想你正在寻找:

git update-index --skip-worktree FILENAME
Run Code Online (Sandbox Code Playgroud)

忽略局部变化

这里有http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/关于这些解决方案的更多解释!

  • 在这个问题上,` - skip-worktree`和`--assume-unchanged`之间有一个相关的讨论(http://stackoverflow.com/questions/13630849/git-difference-between-assume-unchanged-和跳worktree) (9认同)
  • 要撤消,请使用 ```git update-index --no-skip-worktree &lt;file&gt;``` (4认同)
  • @Anomaly 要列出 --skip-worktree 忽略的文件,您需要这个`git ls-files -v | grep ^S` (3认同)
  • 我将如何撤消此操作,或者查看当前通过“--skipworktree”忽略的文件/模式列表,我以后是否应该改变主意并想要再次开始跟踪文件? (2认同)

Bir*_*abs 46

您可以安装一些git别名以简化此过程.这会编辑文件的[alias]节点.gitconfig.

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'
Run Code Online (Sandbox Code Playgroud)

这个安装的快捷方式如下:

  • git ignore config.xml
    • git会假装它没有看到任何变化config.xml- 防止你意外地提交这些变化.
  • git unignore config.xml
    • git将恢复确认您的更改config.xml- 允许您再次提交这些更改.
  • git ignored
    • git将以上述方式列出您"忽略"的所有文件.

我通过参考phatmann的答案来构建这些- 它提供--assume-unchanged了相同的版本.

我目前使用的版本--skip-worktree用于忽略本地更改.请参阅Borealid的答案,以获得对差异的完整解释,但基本上--skip-worktree的目的是让开发人员更改文件而不存在提交更改的风险.

git ignored此处显示的命令使用git ls-files -v并过滤列表以仅显示以S标记开头的条目.该S标记表示其状态为"跳过worktree"的文件.有关显示的文件状态的完整列表,git ls-files请参阅-t选项的文档git ls-files.

  • 这不适用于未跟踪的文件:&lt;(osx 上的 git 2.13.5) (2认同)

JES*_*Sii 33

您只需将.gitignore文件添加到主目录即ie $HOME/.gitignore~/.gitignore.然后告诉git使用该命令:

git config --global core.excludesfile ~/.gitignore
Run Code Online (Sandbox Code Playgroud)

这是一个正常的.gitignore文件,git在决定忽略什么时引用它.由于它位于您的主目录中,因此它仅适用于您,并且不会污染任何项目.gitignore文件.

多年来我一直在使用这种方法,效果很好.


Yus*_*sef 10

这是一种简单的解决方案,即在本地排除文件中添加一行。

 echo YOURFILE_OR_DIRECTOY >> .git/info/exclude 
Run Code Online (Sandbox Code Playgroud)

  • 我需要在命令后运行 `git update-index --assume-unchanged YOUR_FILE_OR_DIRECTORY` (5认同)
  • 如果 echo 不起作用,您也可以直接在 .git/info/exclude 下输入文件夹 (2认同)

Ahm*_*eem 7

--assume-unchanged 和 --skip-worktree 都不是在本地忽略文件的正确方法......请检查这个答案和git update-index文档中的注释。文件以任何理由保持经常变化(和/或从克隆到另一个变化)及其变化不应该被提交,然后把这些文件不应该被摆在首位跟踪。

但是,有两种在本地忽略文件的正确方法(都适用于未跟踪的文件)。要么将文件名放在 .git/info/exclude 文件中,该文件是 .gitignore 的本地替代文件,但特定于当前克隆。或者使用全局 .gitignore (它应该仅用于常见的辅助文件,例如 pyz、pycache 等),并且该文件将在您机器中的任何 git repo 中被忽略。

要使上述内容自动化(添加到排除或全局 .gitignore),您可以使用以下命令(添加到您的 bash-profile):

  • 每个克隆本地排除(注意,调用命令时应该在存储库的根目录中,因为使用了相对路径),将##FILE-NAME##更改为 .git/info/exclude
  • 全局 .gitignore,首先在此处创建全局 .gitignore然后将 ##FILE-NAME## 更改为~/.gitignore

Linux

alias git-ignore='echo $1 >> ##FILE-NAME##'
alias git-show-ignored='cat ##FILE-NAME##'
git-unignore(){
  GITFILETOUNIGNORE=${1//\//\\\/}
  sed -i "/$GITFILETOUNIGNORE/d" ##FILE-NAME##
  unset GITFILETOUNIGNORE
}
Run Code Online (Sandbox Code Playgroud)

MacOS(您需要 .bak 进行sed就地修改(即您被迫将文件扩展名添加到就地 sed。即在替换某些内容之前进行备份),因此要删除 .bak 文件,我添加了 rm filename.bak)

alias git-ignore='echo $1 >> ##FILE-NAME##'
alias git-show-ignored='cat ##FILE-NAME##'
git-unignore(){
  GITFILETOUNIGNORE=${1//\//\\\/}
  sed -i.bak "/$GITFILETOUNIGNORE/d" ##FILE-NAME##
  rm ##FILE-NAME##.bak
  unset GITFILETOUNIGNORE
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

git-ignore example_file.txt
git-unignore example_file.txt


aak*_*318 5

为了忽略未跟踪的文件,特别是如果它们位于(一些)未跟踪的文件夹中,一个简单的解决方案是将文件添加.gitignore到每个未跟踪的文件夹中,并输入包含*后跟新行的单行。如果未跟踪的文件位于几个文件夹中,那么这是一个非常简单直接的解决方案。对我来说,所有文件都来自一个未跟踪的文件夹vendor,上面的内容就起作用了。

  • 伟大的!仅供参考:这之所以有效,是因为 git 只跟踪(并允许您提交)文件,而不是文件夹。 (2认同)