问题标签 [git-plumbing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
git - 如何获取 git 提交中更改的文件列表?
我需要在 git 提交中更改的文件列表(特别是常规文件,而不是符号链接、目录、子模块等)。我知道(例如在这个答案中),它git diff-tree --name-status
提供了非常有用的输出,显示了已更改对象的列表以及发生了什么样的更改。这包括T
在类型更改时给出一个标志,但我没有看到任何方法将其过滤为特定类型的对象。
我可以使用什么管道命令来获取类型(大概在应用提交之后,而不是之前)为常规文件类型的文件的列表?
git - 恢复先前阶段的更改(或:撤消对 .git/index 的更改)
当试图了解撤消各种 git 操作的方法时,我想出了一个我不知道如何处理它的场景。免责声明:在实际使用 git 'in production' 时,我没有遇到这种情况,但我仍然认为这不仅仅是一个学术问题。
让我们看看下面的场景
- 操作之前提交的文件:
echo "some content" >> example.txt
- 阶段变化:
git add example.txt
- 上次提交的结帐更改:
git checkout @ -- example.txt
- 意识到您选择了错误的文件并且您想要撤消最后一个命令以
"some content"
恢复您的更改 ()
我认为幕后发生的事情
每次在.git/objects/git add
下创建带有 blob 对象的暂存更改并且索引文件 ( .git/index ) 都会更新。如果我多次更改和添加内容,将会有多个 blob。旧的不会立即被垃圾收集。
当从上面运行 checkout 命令时,索引会立即更新(我还假设内容只会在我的工作目录中,但未暂存)。这样参考就消失了,我不能使用诸如git checkout-index
还原它们之类的东西。
除非垃圾收集在技术上仍然存在。但是我不知道如何取回它,然后手动尝试以某种方式找到哈希并使用git cat-file
. 例如,对于git add
多次运行也是如此,尽管在这里想要返回先前分阶段的更改可能并不是真正的用例。(或者也许当从存储中弹出更改时?...)
所以这一切都归结为这些问题:
git reflog
索引有类似的东西吗?- 被
git checkout @ -- file
认为是像 git 这样的危险命令reset --hard
,您可能会在其中丢失您的工作?
如果答案是“否”/“是”(我到目前为止的假设):
- 是否有手动更改/重写索引的管道命令?(见上面物体仍然存在的情况)
奖励:是否有另一种方法可以在不立即暂存的情况下签出单个文件?
git - git(管道)在两次提交之间更改了文件?
是否有一个 git(最好是管道)命令来检查文件是否在两次提交之间发生了变化?
我可以用一点 grep 来检查,但这感觉不是最干净的解决方案:
编辑:我希望返回码反映文件是否已更改。
git - GIT:获取通过提交添加到存储库的所有 git 对象哈希
是否可以使用 git 命令行工具获取已通过给定提交哈希添加到存储库的所有 git 对象哈希的列表?
我已经尝试使用 git 管道工具将其存档git-diff-tree
。也许这是错误的方法。以下是迄今为止我能得到的最好结果。但是(非常长的手册页)文档并没有帮助找出必须如何准确地解释输出。
第一个和第二个 git 对象 blob 哈希是否分别显示修改文件的旧对象和新对象?在最坏的情况下,我可以通过解析输出来获取该信息。
我的主要目标是找到一个如下工作的命令行:
在下面编辑以响应@torek
为了回应@torek 的回答,我想更清楚我的意图是什么,因为他绝对正确地指出新的不一定是新的。
我打算用来git rev-list --reverse <branch>
按提交顺序获取该分支上所有提交的列表。然后我想按这个顺序访问每个提交,并在每次提交时收集这个分支上第一次看到的 blob 哈希。
最终结果应该类似于以下内容:
C:
提交
B:
blob
如果这不容易完成,则可以进行两次通过。由于您指出的原因,在第一遍中,可以在不同的提交中多次提及 blob:
- 在另一个文件中添加具有相同内容的文件
- 文件修改后内容相同
然后我可以对文件进行第二次传递,通过该文件awk '!x[$0]++'
将删除任何重复项。这不会很有效,但会得到我想要的结果。
我希望我现在表达了我的意图。有什么想法吗?
linux - 使用管道在所有 git 分支中对所有同名文件的属性进行 grep
我有一个按分支分隔的配置文件的 git 存储库,例如:
等等
我正在尝试 grep 每个settings.properties
存储库中每个文件的某些属性:
第一个命令给了我我的分支列表,第二个命令一个接一个地检查每个分支,我希望第三个命令 cat 文件和第四个命令 grep 某些属性。前 2 个命令工作得很好,但如果我运行整个东西,它只会为第一个分支 greps host.name。
我显然遗漏了有关管道的一些重要内容。我知道我可以将它编写为 shell 脚本并在循环中执行所有这些操作,但我想保留“管道”方法,因为我可能经常需要cat
不同的文件和grep
不同的属性并且不想处理传递脚本中的参数
git - 在另一个分支中检测提交差异/补丁/大块,类似于cherry-pick的方式
使用git
,我想检查来自特定提交的哪些差异(如果有)已应用于(以及在何处)应用于特定分支。
cherry-pick
当您选择提交并且仅应用尚未应用于该分支的差异时,会执行此操作(“where”部分除外)。例如,如果我将两个文件更改提交到一个主题分支,我手动将其中一个相同的文件更改应用到 master,当我挑选具有从主题到 master 的两个文件差异的提交时,它只应用未应用的差异。为了证明这一点,从一个空文件夹运行以下命令并查看最终的差异输出:
差异输出是:
表明即使精心挑选的提交有两个文件更改,它检测到第一个已被应用。
所以我的问题是:git 是否有一个暴露的管道(或介于管道和瓷器之间的某个位置)命令,它将查看提交中的大块并检查另一个分支中的每个大块,显示应用每个大块的提交?
如果该命令不存在,有什么途径可以找到它?我已经在考虑编写一个脚本/程序来将提交分解成它的块,在每个上运行 patch-id 或类似的东西,然后从共同祖先开始循环遍历另一个分支并对每个提交执行相同的操作,并且比较帅哥。如果它已经暴露,我想避免写它——我知道它存在,因为cherry-pick 这样做(除了显示“位置”)。
更新: git cherry
会做一些我正在寻找的东西。它会告诉我一个分支中的哪些提交具有一个或多个尚未应用于另一个分支的差异块。它不会告诉您在哪里应用了这些差异大块,或者提交是否有应用的大块和其他未应用的块。
git - git 将多个提交合并为一个孤立分支中的每个提交在前缀子目录中
我需要将多个来自分支或远程仓库的提交合并到另一个分支中的单个提交中。
我需要以一种特殊的方式来做到这一点,其中每个输入分支合并提交的源树是输出分支合并提交的源树中的前缀或子目录:
此外,我需要更改合并提交的一些参数,例如author date
,author email
等,并从所有输入分支的提交消息中生成提交消息,使合并提交的父级保持不变(包括合并中的父级提交哈希列表)犯罪)。
在互联网上挖掘我已经找到了使用最少命令集的最通用的解决方案:
但是当输出分支是孤立分支时,它的工作方式会有所不同。在这种情况下,输入分支的内容会额外合并到输出分支提交的源树的根中:
基本上,当输入分支是唯一的输入分支时会发生这种情况(当输出分支是孤立分支时,我没有测试多个输入分支的情况,因为我还没有这种情况,但我不排除这种情况)。
我找到了发生这种情况的原因。因为头还不存在并且不能存在,包括输出分支,所以合并命令在调用时创建它,同时使合并不完整,输出分支指向输入分支,这实际上使输出分支成为父分支对自己。这会将输入分支的源代码树的内容带入输出分支提交的源代码树的根目录,而无需用户通知。
我知道至少有一种方法可以避免这种行为,例如,在合并之前在输出分支中创建一个空提交,这使得孤立分支不是孤立的,并将头部与对输出分支的引用一起初始化。
但我不希望这样做,因为我必须稍后以某种方式删除该提交,这实际上是 git 的解决方法代码。
是否存在一种众所周知的方法来处理 git 的胆量以使所有事情都按预期工作并合并在一起?
git - 链接 git clean (Porcelain) 命令
我试图对一些未跟踪的文件执行 git clean 。我无意中输入了以下命令:
请注意,该行似乎缺少一个xargs
. 也就是说,我通常会像这样编写前面的命令:
话虽如此,前者有效,后者无效!是的,我知道我可以使用:
那时我不知道排除选项。
只是为了确保您拥有正确的图片,假设您有三个未跟踪的文件x
, y
,z
并且您要排除x
.
将这个输出直接连接到 xargs 而不省略“将删除”部分是错误的并且会导致 git clean 中断,这是有道理的。
现在的问题是:为什么它可以直接将此输出连接到 git clean 它仍然有效?
git - git 对象存储在磁盘上的完整位置列表是什么?
我有一个 git repo,我正在尝试查找磁盘上特定提交的存储位置。
git show <HASH>
显示提交。git cat-file -p <HASH>
以原始形式显示提交。- 提交不在
.git/objects/
. - 提交不在
.git/lfs/objects/
- 里面没有名字
.git/packed-refs
grep -r <HASH>
并且find -name '*<PART_HASH>*'
没有任何结果。
问题:
- 我错过了什么位置?
- 有没有找到位置的命令?