【问题标题】:How can I find out what files have changed in the post-checkout hook in git?如何在 git 的 post-checkout 挂钩中找出哪些文件发生了变化?
【发布时间】:2017-06-08 05:41:16
【问题描述】:

我只是 git 的新手,我正在查看 post-checkout hook。
据我了解,以下命令将从最新提交中恢复“文件名”:

git checkout -- filename

当我在结帐后获得控制权时,我得到 3 个参数,即 2 个 SHA 和一个类型。
两个 SHA 相同,即最后一次提交的 SHA 和类型的值为 0,表示发生文件检出。
但是回家我可以找出签出的文件吗?

【问题讨论】:

  • 我如何找出签出的文件? 基本上,你不知道。您可以(在某些操作系统上)在一组正在运行的进程中四处寻找,看看是否可以找到正在运行您的钩子的git checkout [commit] -- path1 path2 ... pathN 命令;如果是这样,这些文件将是从某个特定提交复制到索引中然后复制到工作树中的文件。

标签: git githooks


【解决方案1】:

The documentation 说:

钩子被赋予三个参数:

  • 前一个 HEAD 的 ref,
  • 新 HEAD 的 ref(可能已更改,也可能未更改),以及
  • 指示签出是分支签出(更改分支,flag=1)还是文件签出(从索引中检索文件,flag=0)的标志。

在你的情况下,你的 HEAD 没有改变。您可能将一些修改后的文件初始化回 HEAD 内容,但除此之外,all files already checked out are still checked out:

git show --pretty="" --name-only HEAD

由于您没有更改分支,因此该标志设置为 0,即使所有文件都已签出。因此,没有简单的方法可以查看哪些内容被修改并重置为 HEAD 内容。


关键是:post-checkout hook 不会影响 'git checkout' 的结果。
换句话说,索引和工作树已经反映了它们的最终状态(并且不记得之前的状态)

如果您需要git checkout . 重置的文件列表,最好先使用git stash。
然后是git checkout:您的结帐后挂钩然后可以use git stash show 以列出结帐前存在的文件。

【讨论】:

  • 你必须想知道为什么你得到一个指示文件正在签出,然后没有让你找到文件名的方法。
  • @GOVarney 同意,但这就是结帐后挂钩的本质:结帐已经发生,文件已经重置,并且信息(重置的文件列表)丢失了。我已经编辑了答案以首先(结帐前)提出git stash。
  • 我的要求是“每当工作目录中的文件被 git 更改时,我都需要处理它”。签出分支时,我假设工作目录中的所有文件都已更改。这可能不是真的,但可能是这样我必须处理目录中的所有文件。这样做很昂贵,但却是必要的邪恶。我希望如果只签出文件,我只需要处理签出的文件。但似乎我无法获得该列表。这是有预结帐挂钩的正当理由吗???然后我可以追踪是什么改变了我自己。 :-)
  • @GOVarney 是的,预结帐钩子可能会有所帮助,尽管没有钩子 (git.661346.n2.nabble.com/…),而且 git stash 经常被提及 (stackoverflow.com/a/40725474/6309)
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 2023-02-10
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多