6

我在我的目录中修改了一个文件(或一些文件),并且我习惯于git add从文件中暂存一些更改行,但不是所有更改的行。

我可以git diff --staged my-file用来查看更改的差异。 git diff --staged my-file忽略已更改但未上演的行。这是输出的示例git diff --staged my-file

diff --git a/ens/cours/ens_cours_JN.csv b/ens/cours/ens_cours_JN.csv
index dcea574..ff33469 100644
--- a/ens/cours/ens_cours_JN.csv
+++ b/ens/cours/ens_cours_JN.csv
@@ -24,6 +24,7 @@ SCALIN_E;EPITA;préparation pédagogique;JN;ING1;2020-05-13;;False;True;PT4H;;
 SCALIN_E;EPITA;préparation pédagogique;JN;ING1;2020-05-20;;False;True;PT4H;;
 SCALIN_E;EPITA;préparation pédagogique;JN;ING1;2020-05-27;;False;True;PT4H;;
 SCALIN_E;EPITA;préparation pédagogique;JN;ING1;2020-06-03;;False;True;PT4H;;
+SCALIN_E;EPITA;préparation pédagogique;JN;ING1;2020-06-03;;False;True;PT4H;;commit this line
 THLR;EPITA;préparation pédagogique;JN;ING1;2020-07-20;;False;True;PT8H;;Recording TDs
 THLR;EPITA;préparation pédagogique;JN;ING1;2020-07-21;;False;True;PT8H;;Recording TDs
 THLR;EPITA;préparation pédagogique;JN;ING1;2020-07-22;;False;True;PT8H;;Recording TDs

问题:如何生成将要提交的文件的文本?我想要一个签入挂钩,以便在允许提交之前最终处理该文件。

我怀疑有一些简单的咒语使用git apply。但是,简单的使用git apply会产生以下诊断消息。

jnewton@Marcello cours % git diff --staged > ens_cours_JN.csv.patch
git diff --staged > ens_cours_JN.csv.patch
jnewton@Marcello cours % git apply ens_cours_JN.csv.patch
git apply ens_cours_JN.csv.patch
error: patch failed: ens/cours/ens_cours_JN.csv:24
error: ens/cours/ens_cours_JN.csv: patch does not apply

我有一个似乎太复杂的解决方案。

  1. 生成 .patch 文件git diff --staged > my-file.patch
  2. 保存原件cp my-file my-file.save
  3. 隐藏更改git stash save my-file
  4. 应用补丁git apply my-file.patch
  5. 保存了所需的结果cp my-file my-file.to-commit
  6. 将文件恢复到预添加状态mv my-file.save my-file
  7. 将字段恢复到添加后状态git stash apply

现在,my file.to-commit是要提交的填充副本。这真的是正确的方法吗?看来我做的工作太多了。

4

2 回答 2

5

您可以利用该:[<n>:]<path>构造来访问相应的暂存 blob,然后执行

git show :my-file

如此处所述:

:[<n>:]<path>, e.g. :0:README, :README
一个冒号,可选地后跟一个阶段号(0 到 3)和一个冒号,后跟一个路径,在给定路径的索引中命名一个 blob 对象。缺少的阶段编号(及其后面的冒号)命名阶段 0 条目。在合并期间,阶段 1 是共同祖先,阶段 2 是目标分支的版本(通常是当前分支),阶段 3 是正在合并的分支的版本。

所以git show :0:path/to/file或更短的git show :path/to/file输出文件的完整分阶段版本。

于 2021-07-02T07:34:56.350 回答
2

对于单个文件,您可以使用git checkout-index

# will overwrite 'that/file.txt' in place with the indexed version :
git checkout-index -- that/file.txt

# will create '/tmp/that/file.txt' :
git checkout-index --prefix=/tmp/ -- that/file.txt

或者您可以明确提及目标--work-tree--git-dir(选项git本身,而不是其子命令),并使用git checkout

git --git-dir=.git/ --work-tree=/tmp/myindex/ checkout -- .

还值得一提:

  • git stash -k将您的未暂存更改存储在存储中,保留索引原样并将磁盘上的内容恢复为
    您可以使用的索引内容git stash applygit stash pop取回未暂存的更改
  • git checkout -- some/path将从磁盘上的索引中获取版本(如果有问题,它将覆盖您的本地更改,使用git stash -k或其他方式来检查您的文件)
于 2021-07-02T08:24:33.253 回答