如何查看Git存储库中的DAG数量以及与每个DAG关联的分支?
我知道,通过将如何查看Git存储库中的DAG数量以及与每个DAG关联的分支?,git,Git,我知道,通过将--orphan选项传递给Git checkout,您可以在Git中创建孤立分支,这将有效地在Git存储库中创建两个独立的DAG,因为孤立分支未连接到主分支的历史记录;但是,如果创建了多个孤立分支,有没有办法计算出给定回购协议中有多少DAG 此外,是否有办法确定存储库中哪些分支(head ref)指向哪个DAG?也就是说,您可以根据分支所指向的提交所属的DAG对分支进行分组吗 这个问题更多的是假设性的,而不是实际性的,因为我不需要做这样的事情,但我还是很好奇。AFAIK Git不跟
--orphan
选项传递给Git checkout,您可以在Git中创建孤立分支,这将有效地在Git存储库中创建两个独立的DAG,因为孤立分支未连接到主分支的历史记录;但是,如果创建了多个孤立分支,有没有办法计算出给定回购协议中有多少DAG
此外,是否有办法确定存储库中哪些分支(head ref)指向哪个DAG?也就是说,您可以根据分支所指向的提交所属的DAG对分支进行分组吗
这个问题更多的是假设性的,而不是实际性的,因为我不需要做这样的事情,但我还是很好奇。AFAIK Git不跟踪单个DAG根。下面是一个在伪代码中查找它们的方法
# Get a list of all branches.
branches = `git branch`
# Store an empty list of roots.
roots = []
while branches
# Pick a branch, any branch.
branch = branches.pop
# Find its root and add it to the list.
root = `git log --topo-order --oneline #{branch} | tail -1`
roots << root
# Remove any branches which contain the root.
branches -= `git branch --contains #{root}`
end
p roots
#获取所有分支的列表。
分支=`git分支`
#存储根目录的空列表。
根=[]
当树枝
#选一根树枝,任意一根。
branch=branchs.pop
#找到它的根并将其添加到列表中。
root=`git log--topo order--oneline#{branch}| tail-1`
根
会找到所有的根
git log --all --ancestry-path ^$root --pretty=%D --simplify-by-decoration
将查找追溯到任何特定根的所有引用(要获得机器可读性,需要进行一些刮取,GNU最紧凑的方式是awk1rs='\n+->,'
)
因此,这将把跟踪到每个根的提示集转储到tips-$root
:
roots=`git rev-list --all --max-parents=0`
for root in $roots; do
git log --all --ancestry-path ^$root --pretty=%D \
| awk 1 RS='\n+|, | -> ' >tips-$root
done
这就是问题的git特定部分,剩下的就是从这些集合中识别不相交的图。任意两个tip集合中的公共元素连接图形
A--\ tools
*---B master
C--/ doc-html
有三个提示,tools
和doc html
没有根,但它们的每个图形都连接到master
提示,如果你仔细看,这里只有一个连接的DAGsort tips-*|uniq-c | sort-n | tail-1
将告诉您连接到任何一个tip的最大根数,echo$roots | wc-w
将告诉您有多少根,如果它们匹配,您有一个连接的历史,如果没有,您还有工作要做
在任何一种工业规模上,我都读过图论中关于识别不相交集的书,但是增量合并一个临时不相交集的列表对于轻任务来说似乎足够有效,在本文中,这意味着“可能是所有的”,并且它在基本unix工具的范围内。对于真正的一次性脚本,您甚至不需要awk
,只需要一个普通的shell脚本,其中shell数组跟踪集合isdisjoint(){return$(0=`sort$*|uniq-d | wc-l`)}
等等。git rev list--all--max parents=0
查找所有根git log--pretty=%D--祖先路径--all ^$root
查找所有可追溯到任何特定引用的引用。@jthill Neat!这应该是一个更好的答案。一个分支也可能有多个根,这使得这个解决方案有点低效。
A--\ tools
*---B master
C--/ doc-html