使用git中某个特定分支的脚本

unhi4e5o  于 2023-08-01  发布在  Git
关注(0)|答案(3)|浏览(112)

这个问题也许有答案,但我找不到。
我有一个分支,我正在工作,我没有完成我在这个分支上的工作。现在,我需要使用的是完全不同的分支预建工具。
我的分支上根本看不到这个脚本,但是我需要运行它来获取一些东西,以继续在我的分支上工作。这里有三个问题:
1.我不想去别的分支结账。我想一直在自己的分支工作
1.我不想在完成之前承诺任何事情
1.我想使用另一个分支中的一些在我自己的分支上不可见的东西
这怎么可能,这可能吗?

r55awzrz

r55awzrz1#

有很多方法可以解决这个问题。他们都归结为一个事实,你太努力了,现在。放松😀点!
让我们从这个开始:分支,在Git中,基本上是不相关的;重要的是 * 提交 。提交包含两件事:每个文件的完整快照,加上一些元数据(例如,关于谁提交的信息)。我们不会在这里深入讨论任何细节,只是要注意任何给定提交的内容都是100%只读的: 任何提交都不能被更改 ,甚至Git本身也不能。
当你在Git中工作时,你首先要 * 提取 * 一些提交。也就是说,您可以运行git checkout *branch*git switch *branch*,甚至git checkout *hash-ID*。这从一个特定的提交中提取每个文件的完整副本。(存储在提交中的文件是一种特殊的,只读的,压缩的,Git化的,去重复的格式,只有Git可以读取,字面上没有任何东西可以写入,这使得它们无用 * 除了 * 这个提取过程。这会提取哪个提交?
提交由哈希ID标识。散列ID又大又丑,除了用鼠标或类似的工具剪切和粘贴之外,人类不可能使用。因此您可以这样做--就像在git checkout *hash-ID*中一样--
或者 * 您可以使用 * 分支名称 * 和其他类似的名称(例如标记名称)。每个名称都是一种拼写一个哈希ID的方式,而不必键入原始哈希ID。分支名称本质上“意味着”* 分支上的最新提交 *。
现在你已经有了那个提交的文件,你可以处理它们,运行git add来更新下一个提交,然后运行git commit,Git会执行一个 new 提交并自动更新分支名称(假设你使用的是分支名称)。这就是你现在的处境
我有一个分支,我正在工作,我没有完成我在这个分支上的工作。
这不是很精确。你的意思是:你 checkout 了一些特定的提交,通过分支名称,然后你开始工作。你还没有准备好进行新的提交。你仍然在“分支上”(所以任何你用来“make”一个新提交的提议的“new”提交都会更新分支名称以记住新的最新提交),并且你希望保持这种状态。
现在,我需要使用的是完全不同的分支预建工具。
让我们把这个也做得更精确。你的意思是你想获取一些文件(shell脚本,命令,无论什么),这些文件存储在某个 * 其他提交 * 中。另一个提交的哈希ID存储在某个其他分支名称中,例如toolbranch

Why all this matters

您可以使用git showgit cat-file -p轻松访问任何提交中的任何单个文件。例如,如果你知道你需要的提交哈希ID是a123456,并且提交的文件的路径名是tools/sometool.sh,你可以运行:

git show a123456:tools/sometool.sh

字符串
Git会将该文件的内容转储到标准输出中,就像存储在提交的文件中一样。使用shell(bash/sh/zsh/whatever)重定向,您可以将此输出放入文件中:

git show a123456:tools/sometool.sh > /tmp/sometool.sh


现在您可以从/tmp/sometool.sh运行该工具。
(The git cat-file -p变体是:

git cat-file -p a123456:tools/sometool.sh > /tmp/sometool.sh


git show的输入稍微容易一点。在脚本中使用git cat-file,因为它是一个“管道”命令;对于正常的人工命令,请使用git show。)

如果我不知道原始哈希ID怎么办?

没问题!分支名称也可以:

git show toolbranch:tools/sometool.sh > /tmp/sometool.sh

如果我需要一大堆toolbranch的文件怎么办?

只要你的Git版本至少是2.5,最好至少是2.15,你就可以使用git worktree add来添加一个 * 完整的独立工作树 *,并 checkout 该提交:

git worktree add ../toolbranch


比如说现在,../toolbranch包含了从提交中提取的整个文件集,通过分支名称toolbranch命名。
考虑到这会让 every 文件脱离期望的提交,对于你的情况来说可能有点过头了。git showgit cat-file -p变体是一个更精致的工具(lightsaber,或者字节军刀,而不是星星大战术语中的爆破器),但有时只是在某些东西上爆破你的方式是很方便的。
(Use git worktree remove来丢弃添加的工作树,或者如果它不打扰你的话,就把它放在一边。在2.15中修复的bug与在添加的工作树中工作时将其放置超过14天有关,所以如果你开始在添加的工作树中工作,并且要让它花费两周或更长时间,请确保你有修复的Git。

dldeef67

dldeef672#

以下是我提出的解决方案:
1.将脚本添加到.gitignore以使其不提交。(如果您打算更改它,可以通过git add --force强制分段)。
1.当您需要运行它时,通过git check out <SCRIPT_BRANCH> <SCRIPT_FILE_NAME>只 checkout 该文件。
通过步骤1,检出的文件不被视为要暂存的文件。

toe95027

toe950273#

您可以在引入工具时找到提交(使用git loggit blame <FILE>)。然后,您可以使用git cherry-pick将此特定提交获取到分支中。如果你不想提交这些更改到你的分支,你可以使用-n标志:

git cherry-pick -n <COMMIT>

字符串
这会将您的工具带到当前分支,而无需提交任何内容。您可以执行脚本并做您想做的事情。之后,您可以执行git reset(取消暂存精选的内容)并删除文件。

相关问题