HOWTO · Git

在 Git 中递归添加文件和文件夹

本教程演示了如何通过 git add 命令递归地在 Git 中添加文件和文件夹。

本页内容

Git 会将文件变更暂存到索引中;索引是 Git 用来准备下一次提交的区域。若要包含嵌套目录中的文件,可将 git add 与整个仓库或某个目录的路径搭配使用。该命令只会暂存变更,不会创建提交,也不会将内容发送到远程仓库。

git add 如何递归暂存文件

将目录路径传给 git add 时,Git 会暂存该路径下符合条件的变更,包括子目录中的文件。你也可以使用 git add -A 暂存整个工作树中的变更,或使用 git add . 暂存当前目录及其下级目录中的变更。这些命令都不需要额外的递归选项。

路径范围很重要:从子目录运行命令时,命令只会作用于其指定的路径范围。若要暂存整个仓库,请从仓库根目录操作;若只想选择一部分,则指定相应目录。除非你有意覆盖忽略规则,否则未跟踪文件仍会受到忽略规则的限制。

从仓库根目录暂存所有变更

若要暂存整个仓库中的变更,请先进入仓库根目录,再运行 git add -A。它会暂存整个工作树中的新增、修改和删除。这适用于项目多个位置都有文件变更,而你希望一次性选择整个仓库变更的情况。

请在已安装 Git 的 shell 中运行下面这个独立示例。它会创建一个临时仓库,添加两个嵌套文件,从仓库根目录暂存这些变更,并打印简短状态。脚本结束时会删除临时目录。

本节中的代码以及显示的标签或输出仍为英文。

work_dir="$(mktemp -d)"
trap 'rm -rf "$work_dir"' EXIT
cd "$work_dir"
git init -q
mkdir -p src/lib
printf 'app\n' > README.md
printf 'module\n' > src/lib/module.txt
git add -A
git status --short

如果你只想暂存当前目录及其下级目录中的变更,请使用 git add .。从仓库根目录运行时,它通常涵盖与 git add -A 相同的工作树路径。从子目录运行时,git add . 仅作用于该目录及其后代目录,而 git add -A 会暂存整个仓库中的变更。若要明确选择整个仓库,请在根目录运行 git add -A。

暂存指定目录

若要将暂存范围限制在项目的某个区域,请从仓库根目录运行 git add path/to/directory/,并将示例路径替换为目标目录。Git 会包含该路径下符合条件的新增和修改文件。目录路径也会让 Git 暂存该目录中已跟踪文件的删除,因此索引会反映这些删除。

如果工作树其他位置还有无关变更,这种较窄的选择范围会很有用。暂存前,请确认路径指向预期目录;git add 会将选定变更记录到索引中,而不是另存一份目录副本。如果只需暂存一个文件,请改为传入该文件的路径。

处理被忽略的文件

.gitignore 文件用于告诉 Git,哪些未跟踪路径应从常规暂存中排除。例如,*.log 这样的模式可以避免生成的日志文件被 git add -A、git add . 或按目录暂存的操作选中。忽略规则适用于构建输出、本地设置以及其他不应纳入提交的文件。

如果某个被忽略的文件确实应纳入版本控制,请先检查它被忽略的原因,再使用 git add -f path/to/file 有意暂存该路径。强制选项会对指定路径覆盖忽略规则。仅当该文件确实属于仓库时才这样做;强行将生成文件或私密文件加入索引,可能会暴露不应公开的内容。向 .gitignore 添加模式,也不会移除 Git 已经跟踪的文件。

提交前检查已暂存的变更

暂存后,运行 git status,查看哪些路径已暂存,以及是否还有未暂存的变更。若要查看简要状态,可运行 git status --short:状态列的第一列标记已暂存的路径,第二列标记未暂存的变更。创建提交前请检查列表,尤其是在暂存整个仓库之后,并确认其中没有被忽略或无关的文件。

暂存只是为提交做准备。提交会将已暂存的快照记录到本地仓库历史中;推送则是单独的操作,用于将提交发送到远程仓库。你可以递归暂存而不提交或推送,也可以在提交之前重新暂存预期路径来调整索引。