我可以忽略本地文件而不污染其他所有人的全局git配置吗?我的git状态中有未跟踪的垃圾文件,但我不想为我在本地分支中的每一个随机未跟踪的小文件提交git配置更改。
从相关的Git留档:
特定于特定存储库但不需要与其他相关存储库共享的模式(例如,存储库中的辅助文件,但特定于一个用户的工作流)应该进入$GIT_DIR/info/exclude文件。
$GIT_DIR/info/exclude
.git/info/exclude文件的格式与任何.gitignore文件相同。另一种选择是将core.excludesFile设置为包含全局模式的文件名。
.git/info/exclude
.gitignore
core.excludesFile
请注意,如果您已经有未分阶段的更改,则必须在编辑忽略模式后运行以下内容:
git update-index --assume-unchanged <file-list>
注意#0:这是git手册中使用到处都是的符号,只是为了指示git存储库的路径。如果设置了环境变量,那么它将覆盖你所在的任何存储库的位置,这可能不是你想要的。
编辑:另一种方法是使用:
git update-index --skip-worktree <file-list>
反过来说:
git update-index --no-skip-worktree <file-list>
你有几个选择:
git config --global core.excludesfile ~/.gitignore
~/.gitignore
.pyc
.pyo
此外,确保您使用的是模式,而不是显式枚举文件(如果适用)。
更新:考虑使用git update-index --skip-worktree [<file>...]代替,谢谢@danShumway!见Borealid对两种选择差异的解释。
git update-index --skip-worktree [<file>...]
老答案:
如果您需要忽略对跟踪文件的本地更改(我们有对配置文件进行本地修改的更改),请使用git update-index --assume-unchanged [<file>...]。
git update-index --assume-unchanged [<file>...]
将以下行添加到. gitconfig文件的[alias]部分
ignore = update-index --assume-unchangedunignore = update-index --no-assume-unchangedignored = !git ls-files -v | grep "^[[:lower:]]"
现在您可以使用git ignore my_file忽略对本地文件的更改,并使用git unignore my_file停止忽略更改。git ignored列出了被忽略的文件。
git ignore my_file
git unignore my_file
git ignored
这个答案来自http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html。
我想你正在寻找:
git update-index --skip-worktree FILENAME
忽略了局部的变化
以下是关于这些解决方案的http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/更多解释!
撤销使用:
git update-index --no-skip-worktree FILENAME
如果您的存储库还没有. gitignore文件,那么一个简单的解决方案是创建一个. gitignore文件,并在其中将.gitignore添加到要忽略的文件列表中。
您可以安装一些git别名以使此过程更简单。这将编辑.gitconfig文件的[alias]节点。
.gitconfig
[alias]
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"'
这为您安装的快捷方式如下:
git ignore config.xml
config.xml
git unignore config.xml
我通过引用phatmann的回答构建了这些-它呈现了相同的--assume-unchanged版本。
--assume-unchanged
我介绍的版本使用--skip-worktree来忽略本地更改。有关差异的完整解释,请参阅Borealid的回答,但本质上--skip-worktree的目的是开发人员可以更改文件而不会有提交更改的风险。
--skip-worktree
此处显示的git ignored命令使用git ls-files -v,并过滤列表以仅显示以S标记开头的条目。S标记表示状态为“跳过工作树”的文件。有关git ls-files显示的文件状态的完整列表:请参阅#4上的-t选项的留档。
git ls-files -v
S
git ls-files
-t
您可以简单地将. gitignore文件添加到您的主目录,即$HOME/.gitignore或~/.gitignore。然后告诉git使用该文件:
$HOME/.gitignore
这是一个普通的. gitignore文件,git在决定忽略什么时会引用它。由于它位于您的主目录中,因此它仅适用于您并且不会污染任何项目. gitignore文件。
多年来,我一直在使用这种方法,取得了很好的效果。
为了忽略未跟踪的文件,特别是如果它们位于(少数)未跟踪的文件夹中,一个简单的解决方案是向每个未跟踪的文件夹添加一个.gitignore文件,并在包含*的单行中输入,然后在新行中输入。如果未跟踪的文件位于几个文件夹中,这是一个非常简单明了的解决方案。对我来说,所有文件都来自单个未跟踪的文件夹vendor,上面的只是工作。
*
vendor
在本地忽略文件的正确方法…请检查git update-index的这个答案和留档中的注释。出于任何原因经常更改(和/或从克隆更改为另一个克隆)并且不应提交其更改的文件,然后首先跟踪这些文件不应该。
但是,有两种正确的方法可以在本地忽略文件(都适用于未跟踪的文件)。要么将文件名放在. git/info/排除文件中,这是. gitignore的本地替代方案,但特定于当前克隆。或者使用全局. gitignore(应该仅用于常见的辅助文件,例如pyz、pyache等),并且该文件将在您机器中的任何git存储库中被忽略。
要使上述内容成为自动化的(添加到排除或全局. gitignore),您可以使用以下命令(添加到您的bash配置文件中):
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}
macOS(你需要. bak来进行sed的就地修改(即你被迫添加一个文件扩展名到就地sed.即在替换之前进行备份),因此要删除. bak文件,我添加了rmfilename.bak)
sed
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##.bakunset GITFILETOUNIGNORE}
然后你可以做:
git-ignore example_file.txtgit-unignore example_file.txt
git-ignore example_file.txt
git-unignore example_file.txt
这是排除本地文件的简短单行解决方案。
echo YOUR_FILE_OR_DIRECTORY >> .git/info/exclude
对于任何想要忽略子模块中本地文件的人:
使用与.gitignore文件相同的格式编辑my-parent-repo/.git/modules/my-submodule/info/exclude。
my-parent-repo/.git/modules/my-submodule/info/exclude
只需简单地将路径添加到ypu要从当前repo的任何分支的提交中删除的文件:
就是这样!对我来说,上面的答案太长了。吻-保持愚蠢简单
太长别读-过滤输出以忽略文件
不要这样做。关于如何做到这一点的技术方法,有很好的答案。然而,我多次找到这个Q/A页面。正如你所看到的,有多种解决方案。问题是每个都会让git忽略该文件;这可能是你现在想要的,但也许不是未来。
细节中的魔鬼,
git
要么将其添加到. gitignore,要么将过滤器写入git status,以主动过滤掉文本。每个都会忽略该文件,但为什么它被忽略的答案更明显。包装脚本(或命令行调用)的第二种情况非常明显地表明您选择忽略什么,以及您的工作流程是非标准的。
git status