我想使用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
答案 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 3f7ba60,commit 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 上)。
我们也可以考虑从输出列表中省略所有失败的条目,但这可能不是一个好主意,因为即使结帐失败,相关的临时文件也可能已经创建,因此脚本可能想要使用用于清理的输出列表。