如何`git add`非递归?

时间:2015-06-05 09:47:30

标签: git svn recursion

当我git add文件夹时,整个内容和所有子文件夹都会自动暂存。如果文件夹包含我不想提交的子文件夹,我必须手动取消它们,然后将它们添加到.gitignore。显而易见的破坏感觉就像我在这里做错了一样。

解决方案是在添加之前编辑.gitignore。但是在文件夹结构非常深/复杂的情况下,这有点棘手,因为很容易忘记忽略某些深层嵌套的文件/文件夹。

我正在寻找的是像SVN的add一样的逐步--non-recursive,允许逐级添加文件夹而无需暂存整个内容。但是,我找不到git add的此功能。所以我想知道:这种非递归添加的推荐git工作流程是什么?

考虑到其他人的确具有opposite problem:也许我上面描述的行为是我的git版本(1.9.1)/设置的问题?

4 个答案:

答案 0 :(得分:5)

添加一个完整的复杂目录层次结构是一件不寻常的事情(当然也不是通常的git开发工作流程中发生的事情),因此git没有它的特殊功能。您始终可以使用外部工具来汇总要添加的文件列表,并将该列表提供给git add,例如要只以非递归方式添加当前目录中的文件,请执行

git add $(find . -type f -maxdepth 1)

或者,您可以使用

git ls-files --others --directory > file-list

在当前目录中创建未跟踪文件的列表,并在编辑器中对其进行编辑,以删除您不想添加的所有内容。 (确保删除file-list本身。)然后您可以使用

git add $(cat file-list)

在已编辑的列表中添加文件和目录。 (您离开的目录仍将以递归方式添加)。

答案 1 :(得分:0)

如果您只想添加目录中没有任何其他子文件夹的文件,您可以执行以下操作:

git add FolderName/\*.* 

其中*.*表示来自每种文件类型的每个文件。文件夹没有扩展名,所以他们不会通过。

答案 2 :(得分:0)

我遇到了这个问题,正在寻找其简单的标题答案:我想git对它的{{进行所有操作(添加) 1}}有效,但仅适用于当前目录及其子目录。尽管@Sven Marnach的答案与find接近,但仍不会考虑任何删除。但是他出色地提到了add,它帮助我完成了这项工作:

git ls-files

我仍然发现它有些脆弱,因为它无法处理名称中带有斜线的文件。我认为这些情况较为罕见,因此我认为这在大多数情况下都适用。但是它确实很好地处理了添加和删除。另一个限制是,仅当您当前位​​于要从中进行更改的目录中时,它才会起作用,因为我使用斜杠作为提示,以从要添加的列表中删除子目录条目。

此外,如果您将经常使用它,请创建一个别名或git命令。

答案 3 :(得分:0)

一种简单的替代方法是在子目录中添加一个文件,然后可以根据需要继续添加其他文件。

git add somedir/goodfile
cd somedir
git add anotherfile