如何使git checkout-index剥离前缀

时间:2016-08-11 15:56:19

标签: git

我想使用git checkout-index,以便从文件名中删除当前前缀。

例如,我坐在目录

中的存储库中
 repo/foo/bar/baz

并且在这个目录中有一堆文件和目录

./file1
./dir1/file2

我想对目录/ tmp / baz执行git checkout-index,以便我最终得到

/tmp/baz/file1
/tmp/baz/dir1/file2

如果我这样做

git checkout-index --prefix=/tmp/baz/ 

然后我最终

/tmp/baz/foo/bar/baz/file1
/tmp/baz/foo/bar/baz/dir1/file2

2 个答案:

答案 0 :(得分:0)

可能不是最好的解决方案,但是如果你执行git checkout-index --temp <file>,你只能得到一个带有.merge_file_XXX名称的文件(从checkout-index的输出中捕获名称)然后你可以mv那个到你想要的地方并重命名它,但文件仍留在索引中(如果你想取消它,你可以git重置它)。你可以把它包装成一个脚本。

另一种方法可能是使用git ls-files --stage,它将列出所有blob,你可以git显示blob来获取文件内容,并通过剥离输出上的路径前缀来创建文件名(与git ls-files输出中的sha相同的行)。再次,一个可编写脚本的东西。

答案 1 :(得分:0)

如果您使用 git checkout-index --temp <file> 方法,请确保使用 Git 2.31(2021 年第一季度)。

改进了围绕“git checkout-index(man) 的“--temp/--prefix”特性的错误代码路径。

参见commit 3f7ba60commit 9334ea8(2021 年 2 月 16 日),作者 Matheus Tavares (matheustavares)
(2021 年 2 月 25 日在 Junio C Hamano -- gitster --commit 3da165c 合并)

<块引用>

checkout-index:从 --temp 输出中省略没有临时名称的条目

签字人:Matheus Tavares

<块引用>

使用 --temp(或 --stage=all,这意味着 --temp),checkout-index 将一个列表写入标准输出,将临时文件名与条目的名称相关联。
但是,如果它无法写入条目,并且该失败甚至在为该条目分配临时文件名之前就发生了,我们会得到一个奇怪的输出行。
这可以在尝试检查缺少 blob 的符号链接时看到:

$ missing_blob=$(git hash-object --stdin </dev/null)
$ git update-index --add --cacheinfo 120000,$missing_blob,foo
$ git checkout-index --temp foo
error: unable to read sha1 file of foo (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)
        foo

TAB foo”行没有多大用处,它可能会破坏期望“tempname TAB foo”输出的脚本。
因此,让我们从 stdout 列表中省略此类条目(但将错误消息留在 stderr 上)。

我们也可以考虑从输出列表中省略所有失败的条目,但这可能不是一个好主意,因为即使结帐失败,相关的临时文件也可能已经创建,因此脚本可能想要使用用于清理的输出列表。