问题标签 [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 目录权限总是 000
通过弄乱 Git 对象,我发现树对象中的树条目总是具有这些权限。
04表示它是一个目录,但权限是000。这是否意味着Git不存储树权限,或者是Unix的工作方式?
git - git:确定脚本中未合并分支的最佳方法
在交互式提示下,我可以使用该git branch -r --no-merged
命令来确定尚未合并的远程分支。但是,git branch
它是一个瓷器命令,因此不适合在脚本中使用。
有什么好的管道命令可以用来确定--no-merged
选项返回的相同分支吗?
git - 哪个管道命令提供与 git log --follow 相同的功能?
为了提高稳定性,我目前正在重构所有与 Git 相关的 shell 脚本,以便它们只使用管道(而不是瓷器)命令。特别是,我试图通过调用(管道)来替换对git log
(瓷器)的调用。git rev-list
然而,尽管git rev-list
似乎提供了 的大部分功能git log
,但它似乎缺少与git log
'--follow
标志等效的选项,该标志告诉 Git 列出影响路径的提交,甚至超出重命名(例如README
-> README.md
)。从git log
手册页:
--follow
继续列出重命名后的文件历史记录(仅适用于单个文件)。
我已经筛选了git rev-list
手册页,但找不到任何与git log --follow
. 我错过了什么?可以这样做git rev-list
吗?还是我应该完全使用另一个管道命令?
git - Git 管道:在提交时导出树而不接触 HEAD/索引
我正在编写一个程序,该程序需要同时从同一个存储库中提取不同的提交(就像在这个问题中一样,但同时)。
瓷器命令(例如git checkout
和git archive
)对索引进行操作,因此任何时候需要提取提交时,都需要先移动 HEAD 和/或通过索引。
有没有一种简单的方法可以将 Git 树对象转储到文件系统上的目录中?
java - 使用 Jgit 和管道命令创建提交
我正在尝试使用 JGit 中的管道命令构建提交。除了获取信息,我使用的基本上是这些命令:
最终
最后将最终树设置为提交。这适用于某些提交,但对于其他提交,尽管文件在那里,但我无法推送 repo。bash 说:
错误:解包失败:错误无效树(树号):错误排序
我在这里发现
树条目按包含条目名称的字节序列排序。但是,出于排序比较的目的,比较树对象的条目就好像条目名称字节序列有一个尾随的 ASCII '/' (0x2f)。
因此,尝试根据转换为对象名称(不是文件名)字节的特定顺序添加文件,但与来自 bash 的实际提交相比,我无法弄清楚 Git 需要哪个顺序添加文件。
所以:任何人都知道如何使用 JGit 中的管道方法来构建包含多个文件的提交?我很确定我只需要正确的对象排序方式,但不知道它是什么
git - Git id 没有显示二进制文件的任何冲突
我们正在将二进制文件签入 git。问题是 git 在合并时不显示冲突/更改。它只是接受文件并覆盖它,即使有冲突。我不确定 git 是否理解二进制文件。请帮助并提供建议。
注意:二进制文件是由我们自己的工具生成的。
git - Git保存使用index update-index命令添加的文件的所有版本?
我试图理解 git 的管道命令以及它的低级操作如何构建高级操作,如添加和提交。
我知道,每次我使用:
我从这个文件创建 blob 并在索引中创建引用(文件名和 SHA1 密钥一起写)(当然只有在文件被更改的情况下)。如果我提交,我会创建只指向一个 blob 的树(我只更改了一个文件)。
但是在 .git/objects 数据库中存储的不是一个,而是更多(例如五个或六个)由 update-index 命令从这个文件创建的 blob,它们不是由任何 commit object 指向的任何树所指向的。git 应该只保存这个 blob,它们位于提交创建的快照中。
Git 有一些自动垃圾回收,以后可以去掉不指向的 blob?命令 update-index 是 add 命令的完全等价物吗?
git - git scripting:如何列出所有包含提交的 git 分支
我可以列出包含某个提交的所有分支,使用git branch --list --contains
就好了。但正如有关如何列出所有分支的相关问题中所解释的,这是一个不应在脚本中使用的瓷命令。
后一个问题建议使用管道命令git for-each-ref
,但不支持--contains
。
列出包含某个提交的所有分支的正确管道接口是什么。
git - 删除提交的父级,从而使其成为初始提交
注意:我知道这是在改写历史,会改变所有的哈希值,把其他人搞砸。
我想提交,并删除其父级。具体来说,提交现在应该看起来像一个初始提交。这意味着它的差异会改变;在历史上的那个时刻,看起来所有文件都是由该提交创建的。
如何做到这一点?(当然,我可以去编辑提交对象,但是提交不会相互指向。)另外,我想在一个新分支上执行此操作(这意味着现在有两个历史记录:原始的一个,另一个提交是初始提交。)
git - 哪些管道命令与 git add 实现相同?
我想通过了解进入时实际发生的情况来更好地理解git-plumbing
和
它是如何工作的?
通过阅读progit 的 git internals section 可以获得一个粗略的想法。
- If
$DIRECTORY
是一个目录,类似于find $DIRECTORY -type f -exec git add {} \;
,即递归添加所有文件在$DIRECTORY
. 然后,git add $FILENAME
适用于每个文件。 - 检查
.gitignore
(及其“上级”) - 检查,如果适用
.gitattributes
,运行过滤器clean
git hash-object -w
编辑clean
内容
然后,索引以某种方式得到更新,这涉及git mktree。但是那里到底发生了什么?目录的树是否仅包含添加的文件或之前提交的所有文件?接下来会发生什么?