如何将其他Git仓库内的文件添加到当前Git仓库中?
问题根本原因
Git默认存在嵌套仓库扫描阻断逻辑:只要Git在扫描路径时发现某级目录下存在.git文件夹,就会将该目录识别为独立的外部仓库根目录,不会将目录下的文件作为普通内容纳入当前仓库的追踪,该逻辑优先级高于子模块相关配置,所以你修改submodule.ignore等配置不会生效。
可行解决方案
方案1:临时重命名.git文件夹(你已实现的方案)
你写的脚本是目前兼容性最高的实现方式,核心逻辑就是在执行git add的瞬间把路径上的.git文件夹改名,绕开Git的嵌套仓库扫描,首次添加成功后,Git就会将该文件纳入当前仓库的追踪列表,后续把.git文件夹改回原名,也不会影响add、commit等操作的正常执行。
对应脚本如下:
# Check if there is a .git folder. If so, we need to temporary # rename it, so we can track the file/folder. GIT_DIR= TRAVERSAL_PATH="$RESOURCE_TO_TRACK" while [[ "$TRAVERSAL_PATH" != "/" ]]; do if [[ -d "$TRAVERSAL_PATH/.git" ]]; then GIT_DIR="$TRAVERSAL_PATH/.git" break fi TRAVERSAL_PATH="$(dirname $TRAVERSAL_PATH)" done [[ "$GIT_DIR" != "" ]] && mv "$GIT_DIR" "$GIT_DIR.keep" git add -v -f "$RESOURCE_TO_TRACK" [[ "$GIT_DIR" != "" ]] && mv "$GIT_DIR.keep" "$GIT_DIR"
其中$RESOURCE_TO_TRACK是你要添加到仓库的文件或文件夹路径。
方案2:手动写入暂存区(无需修改.git文件夹)
如果不想动外部仓库的.git目录,也可以通过Git底层命令直接把文件写入当前仓库的暂存区:
- 生成目标文件的Git对象并写入对象数据库:
git hash-object -w ../a/file.txt
- 记录命令输出的哈希值,执行以下命令将文件添加到暂存区,把
<哈希值>替换为上一步得到的结果:
git update-index --add --cacheinfo 100644 <哈希值> a/file.txt
注意事项
这种双仓库同时追踪同一个文件的模式会存在冲突风险:两个仓库的提交记录完全独立,任意一侧对文件的修改不会同步到另一侧,后续合并时容易出现内容覆盖问题,仅建议特殊场景下临时使用。
内容的提问来源于stack exchange,提问作者f00860
相关产品推荐
相关产品推荐

