能否将指定Git子目录当作根目录添加至替代索引文件?
问题描述
我希望使用替代索引文件,在同一Git仓库中创建类似git notes风格的、拥有独立历史的完全独立文件系统结构。为简化操作,我希望能将任意目录通过git add添加至(替代)索引文件,并将其当作工作树的根进行提交。
例如,假设目录结构如下:
. └── subdir └── hello.txt 1 directory, 1 file
正常执行git add subdir后,索引内容为:
git ls-files -s 100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad 0 subdir/hello.txt
而我希望索引内容变为:
git ls-files -s 100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad 0 hello.txt
请问Git中是否存在现成机制,可将用户指定目录当作根目录添加至索引文件,还是只能使用update-index这类底层命令手动添加每个文件至对应相对路径?
回答
Git有现成的机制可以实现这个需求,无需手动逐个文件处理,以下是两种常用方法:
方法一:使用git add的--work-tree选项
在仓库根目录下执行命令,指定目标目录作为临时工作树,直接将该目录下的文件以根路径形式添加到索引:
# 添加subdir目录下的所有文件到当前索引(路径不带subdir前缀) git add . --work-tree=./subdir
如果要使用自定义替代索引文件(实现独立历史),可以通过GIT_INDEX_FILE环境变量指定索引文件路径:
# 指定自定义索引文件,将subdir内容添加进去 GIT_INDEX_FILE=./.git/alt_index git add . --work-tree=./subdir # 使用该索引文件提交,生成独立的提交记录 GIT_INDEX_FILE=./.git/alt_index git commit -m "Import subdir files as root"
方法二:切换到目标目录并指定仓库路径
进入目标目录后,通过--git-dir参数指定仓库的.git目录,直接执行git add .即可:
cd subdir # 将当前目录下的文件添加到仓库的索引(路径不带subdir前缀) git add . --git-dir=../.git cd ..
同样结合GIT_INDEX_FILE可以实现自定义索引的独立提交:
cd subdir GIT_INDEX_FILE=../.git/alt_index git add . --git-dir=../.git cd .. GIT_INDEX_FILE=./.git/alt_index git commit -m "Add files from subdir as root"
这两种方法都能直接将指定目录当作根目录添加到索引,无需使用git update-index手动逐个处理文件。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

