5

我想将 git 存储库中的单个文件检出到不同的位置(工作目录除外),并保持当前工作目录不变。我希望 git 以正确的行结尾签出我的文件。

我在 Windows 上工作,但我在 Linux 上也有同样的问题。

这是我的场景(Win7 64 位):

首先,我确保 git 在提交时将 CRLF 转换为 LF,在结帐时将 LF 转换为 CRLF:

git config --local core.autocrlf true

然后我创建一个名为 crlf.txt 并带有 CRLF 行结尾的文件并提交它:

git add crlf.txt
git commit -m "File with crlf"

我在 crlf.txt 中更改了一些内容并提交:

git add crlf.txt
git commit -m "Change in crlf.txt"

现在我想像第一次提交一样获得 crlf.txt:

git show HEAD~1:crlf.txt > "/home/user/crlf_like_in_head-1.txt"

文件“crlf_like_in_head-1.txt”不包含 CRLF,但包含 LF。我认为 git show 是正确的,因为它显示的文件内容就像它在存储库中一样(core.autocrlf=true 将 CRLF 转换为 LF)。我从文档中知道这一点,我对 core.autocrlf=false 进行了同样的尝试。core.autocrlf=false "crlf_like_in_head-1.txt" 包含 CRLF。我知道我可以轻松地将 LF 转换为 CRLF,但我必须确保结果文件与使用 git 签出的文件相同。

我知道我也可以使用 git checkout 签出单个文件:

git checkout HEAD~1 crlf.txt

但它会覆盖工作目录中 crlf.txt 的当前内容(如果 crlf.txt 处于脏状态),我无法使用 git checkout 将其签出到不同的文件夹。

4

1 回答 1

1

你说得对 -git show只是向你展示了 repo 中的内容 - 没有结帐魔术。

您可以通过临时更改结帐工作目录的位置来实现您想要的

git --work-tree=/home/user checkout HEAD~1 crlf.txt

这会将文件签出到/home/user/crlf.txt. 注意:如果您签出子目录中的文件,该目录也将在目标文件夹中创建。您无法阻止,也无法指定目标文件的文件名。如果这是一个问题,您应该编写一个 2 行 shell 脚本,将检出到临时目录,然后移动检出的文件。

于 2012-12-05T08:54:25.830 回答