从远程分支签出文件并重命名

Checkout a file from a remote branch and rename it

我想知道是否可以将文件从远程分支签出到我的本地分支并重命名它。

例如:

(大师)/my-project/my-awesome-file.txt

我想通过执行来获取文件 git checkout master my-awesome-file.txt ---> my-file.txt

因此,与其替换 my-awesome-file.txt,不如创建它的副本(来自 master)并将其命名为 my-file.txt

提前致谢。

您可以通过git show <revision>:<path>获取文件内容,并将其写入文件即可创建。

git show master:my-awesome-file.txt > myfile.txt

从技术上讲,您通常会签出(或切换到)整个提交。这将从该提交中提取所有文件。要从特定提交中提取单个文件,您可以限制 git checkout,或使用 git restore,但这两个不允许您重命名文件。

可以很容易做到的是显示来自特定提交的文件。只需写下提交的名称——它的哈希 ID,或者它的哈希 ID 的某个代理——后跟冒号 : 和该提交​​中该文件的 path-name。将其作为 git showgit cat-file -p 的参数。例如:

git show master:my-awesome-file.txt

或:

git show a123456:path/to/file.txt

输出到标准输出,你可以重定向任何你喜欢的地方:

git show ${hash}:${path} > $out

其中 hashpathout 是 shell 变量(或根据需要扩展它们),因此:

git show master:my-awesome-file.txt > /tmp/foo.txt

如果您将输出重定向到当前工作目录中的一个文件,该文件是您 work-tree 的一部分,该文件现在位于您的 work-tree:

git show master:my-awesome-file.txt > my-file.txt

关于未跟踪文件的说明

如果这个文件不在Git的索引(又名暂存区),它现在是一个未跟踪文件,除非文件名与 .gitignore 或类似文件中的指令相匹配,否则将在 git status 中显示。

请注意,.gitignore 文件并未列出要忽略 的文件,真的。相反,它列出了如果未跟踪、Git 不应不抱怨 的文件。如果文件跟踪——也就是说,如果它的名字现在出现在Git的索引中——文件不会被忽略,即使其名称列在 .gitignore 中。这意味着名称 .gitignore 是用词不当:应该改为 .git-do-not-complain-about-these-files-if-they-are-untracked。但这并没有涵盖 .gitignore 所做的一切,所以它可能应该是更长且更不可用的东西。但是这个文件的名字越长越不可用,它就越荒谬,所以 Git 就叫它 .gitignore 尽管这是错误的名字。

通常,git status 抱怨 未跟踪的文件,提醒您应该使用 git add 来跟踪它们。但是,如果文件不应该被 git add 编辑,这种抱怨比无用更糟糕。所以 .gitignore 让你列出 (a) Git 不应该抱怨的文件,和 (b) Git 应该 跳过 如果你使用en-masse “添加所有内容”操作类似于 git add .。 skipping-over 部分是真正“忽略”这些文件的主要意义。 not-complaining也是一种的无视,也许吧。但是如果文件被跟踪——如果它以某种方式进入了Git的索引,例如你运行 git add --force——那么它就不是完全被忽略了。

如何知道文件是否被跟踪?答案通常是“你不知道”。如果 git status 没有 抱怨 ,可能是因为它没有被跟踪,但也可能是因为你没有 改变 它。但在大多数情况下,如果你没有改变它,你也不会在意,所以你甚至不必首先问“这个文件是否被跟踪”。如果git status确实报错,说是untracked,那肯定是untracked,如果git status说是changed——并且要么被提交,要么还没有被提交——然后它就被跟踪了。 (或者,您可以使用 git ls-files --staged 在 Git 的索引中查看 所有内容 ,但这通常是太多的信息,就像我在这里的回答之一。 )