我在变更集中有一堆文件,但我想特别忽略一个修改过的文件。在git status
之后看起来像这样:
# modified: main/dontcheckmein.txt
# deleted: main/plzcheckmein.c
# deleted: main/plzcheckmein2.c
...
我有办法git add
,但只是忽略我不想触摸的一个文本文件?类似的东西:
git add -u -except main/dontcheckmein.txt
答案 0 :(得分:698)
git add -u
git reset -- main/dontcheckmein.txt
答案 1 :(得分:113)
1)开始忽略对单个已版本化文件的更改
git update-index --assume-unchanged "main/dontcheckmein.txt"
并撤消git update-index --no-assume-unchanged "main/dontcheckmein.txt"
2)完全忽略阻止在存储库中创建的特定单个文件
首先看一下这个Git global ignore not working
并在.gitignore
添加文件的相对路径,而不引导./
因此,如果您的文件位于MyProject/MyFolder/myfile.txt
(其中.git
也位于MyProject
),则.gitignore
只放置此MyFolder/myfile.txt
您可以使用git check-ignore "MyFolder/myfile.txt"
关于全局忽略
该链接说明~/.gitignore_global
;但该文件与您的项目有关;所以,如果你将排除模式MyFolder/myfile.txt
放在~/.gitignore_global
,它会起作用,但没有多大意义......
另一方面,如果您使用git config core.excludesfile .gitignore
设置项目.gitignore
位于MyProject
;该设置将覆盖可以very useful rules ...
~/.gitignore_global
所以,就目前而言,我认为最好是制作一些脚本,将您的.gitignore
与~/.gitignore_global
.gitignore
混合在一起。
最后一次警告
如果您要忽略的文件已经存储在存储库中,则除非您执行此操作,否则此方法将无效:git rm "MyFolder/myfile.txt"
,但请先备份它,因为它也将在本地删除!你可以稍后再复制......
答案 2 :(得分:62)
对于文件
git add -u
git reset -- main/dontcheckmein.txt
对于文件夹
git add -u
git reset -- main/*
答案 3 :(得分:27)
现在git
通过pathspec magic exclude certain paths and files
及其缩写形式:(exclude)
支持:!
。因此,您可以通过以下命令轻松实现它。
git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt
实际上,您可以指定更多:
git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
答案 4 :(得分:19)
虽然Ben Jackson是正确的,但我想我会添加我一直在使用该解决方案的方式。下面是我使用的一个非常简单的脚本(我称之为gitadd)来添加所有更改,除了我在一个名为.gittrackignore
的文件中列出的少数几个(非常类似于.gitignore如何工作)。
#!/bin/bash
set -e
git add -A
git reset `cat .gittrackignore`
这就是我目前.gittrackignore
的样子。
project.properties
我正在开发一个Android项目,我在部署时从命令行编译。这个项目依赖于SherlockActionBar,所以它需要在project.properties中引用,但这与编译混淆,所以现在我只需键入gitadd
并将所有更改添加到git而无需取消添加项目。属性每一次。
答案 5 :(得分:6)
git add .
git reset main/dontcheckmein.txt
答案 6 :(得分:4)
试试这个:
git checkout - main / dontcheckmein.txt
答案 7 :(得分:2)
使用git add -A
一次添加所有已修改和新添加的文件。
实施例
git add -A
git reset -- main/dontcheckmein.txt
答案 8 :(得分:2)
我们可以添加所有文件,排除需要通过git reset删除的文件。
git add .
git reset -- <file_name_to_exclude>
答案 9 :(得分:0)
我使用git add --patch
相当多,想要这样的东西,以避免必须始终通过相同的文件点击 d 。为了完成工作,我掀起了一对非常笨拙的git别名:
[alias]
HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ( [[ \"$1\" ]] && egrep -v \"$1\" || cat ); }; f"
ap = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST' )"
在我的情况下,我只是想一直忽略某些缩小的文件,但你可以使用像$GIT_EXCLUDE_PATTERN
这样的环境变量来获得更一般的用例。
答案 10 :(得分:0)
对于问题中的具体情况,最简单的方法是添加 .c 扩展名的所有文件,并忽略其他所有内容:
git add *.c
来自git-scm(或/和man git add
):
git add&lt; pathspec&gt; ...
要添加内容的文件。可以给出Fileglobs(例如* .c)来添加所有匹配的文件。 &LT; ...&GT;
请注意,这意味着您还可以执行以下操作:
git add **/main/*
添加main
文件夹中的所有文件(未被忽略)。你甚至可以使用更复杂的模式:
git add **/s?c/*Service*
以上内容将添加s(any char)c
文件夹中的所有文件,文件名中包含Service
个文件。
显然,每个命令不限于一种模式。也就是说,你可以要求git添加扩展名为 .c 和 .h 的所有文件:
git add *.c *.h
这个link可能会给你一些更多的全局模式。
当我做出很多改变时,我发现它特别有用,但仍然希望我的提交保持原子性并反映渐进过程,而不是我当时可能正在工作的大杂烩。当然,在某些时候,提出复杂模式的成本超过了使用更简单的方法添加文件的成本,甚至一次只能添加一个文件。但是,大多数时候我很容易通过一个简单的模式精确定位我需要的文件,并排除其他所有文件。
顺便说一句,你可能需要引用你的glob模式才能使它们工作,但对我来说绝对不是这样。
答案 11 :(得分:0)
要提交的更改: (使用“ git reset HEAD ...”取消登台)
答案 12 :(得分:0)
要保留文件中的更改但不提交,我做了
git add .
git reset -- main/dontcheckmein.txt
git commit -m "commit message"
要验证文件是否被排除
git status
答案 13 :(得分:0)
不是直接要求的,因为它不能在一个命令中实现,但结果应该是您想要的。
通过
将所有文件添加到暂存区后git add -u
输入 git status
会建议您
git restore --staged main/dontcheckmein.txt
答案 14 :(得分:-2)
您可以尝试以下操作:git add * && git reset main/dontcheckmein.txt