除了单个文件之外,将所有文件添加到提交中?

时间:2010-12-17 22:53:55

标签: git git-add

我在变更集中有一堆文件,但我想特别忽略一个修改过的文件。在git status之后看起来像这样:

# modified:   main/dontcheckmein.txt
# deleted:    main/plzcheckmein.c
# deleted:    main/plzcheckmein2.c
...

我有办法git add,但只是忽略我不想触摸的一个文本文件?类似的东西:

git add -u -except main/dontcheckmein.txt

15 个答案:

答案 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"

check here

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