据我所知,所有分布式版本控制系统都要求您克隆整个存储库。出于这个原因,将大量内容放在一个单一的存储库中是不明智的(感谢 this answer)。我知道这不是错误而是功能,但我想知道这是否是所有分布式修订控制系统的要求。
在分布式 rcs 中,文件(或内容块)的历史记录是一个有向无环图,那么为什么不能克隆这个单个 DAG 而不是存储库中所有图的集合?也许我错过了一些东西,但以下用例很难做到:
最佳答案
从 Git 2.17(2018 年第二季度,10 年后)开始,可以实现 Mercurial 计划实现的功能:“narrow clone ”,即您只检索特定子目录数据的克隆。
这也称为“部分克隆”。
这与现在的不同
jeffhostetler )(2017 年 12 月 8 日)。jhowtan ) (2017 年 12 月 8 日)。gitster -- 在 commit 6bed209 中 merge ,2018 年 2 月 13 日)git clone --no-checkout --filter=blob:none "file://$(pwd)/srv.bare" pc1
sha1_file: support lazily fetching missing objects
Teach
sha1_fileto fetch objects from the remote configured inextensions.partialclonewhenever an object is requested but missing.
extensions.partialclone 也没有定义部分克隆过滤器。jhowtan )(2018 年 6 月 11 日)。gitster -- 在 commit 92e1bbc 中 merge ,2018 年 6 月 28 日)
upload-pack: disable object filtering when disabled by config
When
upload-packgained partial clone support (v2.17.0-rc0~132^2~12, 2017-12-08), it was guarded by theuploadpack.allowFilterconfig item to allow server operators to control when they start supporting it.That config item didn't go far enough, though: it controls whether the '
filter' capability is advertised, but if a (custom) client ignores the capability advertisement and passes a filter specification anyway, the server would handle that despite allowFilter being false.This is particularly significant if a security bug is discovered in this new experimental partial clone code.
Installations withoutuploadpack.allowFilterought not to be affected since they don't intend to support partial clone, but they would be swept up into being vulnerable.
git fetch $repo $object”没有正确获取由 promise 包文件中的对象引用的请求对象,该对象已修复。jhowtan )(2018 年 9 月 21 日)。gitster -- 在 commit a1e9dff 中 merge ,2018 年 10 月 19 日)
fetch: in partial clone, check presence of targets
When fetching an object that is known as a promisor object to the local repository, the connectivity check in
quickfetch()inbuiltin/fetch.csucceeds, causing object transfer to be bypassed.
However, this should not happen if that object is merely promised and not actually present.Because this happens, when a user invokes "
git fetch origin <sha-1>" on the command-line, the<sha-1>object may not actually be fetched even though the command returns an exit code of 0. This is a similar issue (but with a different cause) to the one fixed by a0c9016 ("upload-pack: send refs' objects despite "filter"", 2018-07-09, Git v2.19.0-rc0).Therefore, update
quickfetch()to also directly check for the presence of all objects to be fetched.
git rev-list --exclude-promisor-objects 列出部分克隆的对象,不包括“promisor”对象(For internal use only.) Prefilter object traversal at promisor boundary.
This is used with partial clone.
This is stronger than--missing=allow-promisorbecause it limits the traversal, rather than just silencing errors about missing objects.
matvore )(2018 年 12 月 5 日)。gitster -- 在 commit c333fe7 中 merge ,2019 年 1 月 14 日)"
git rev-list --exclude-promisor-objects" had to take an object that does not exist locally (and is lazily available) from the command line without barfing, but the code dereferenced NULL.
list-objects.c :不要为缺少的 cmdline 对象设置段错误When a command is invoked with both
--exclude-promisor-objects,--objects-edge-aggressive, and a missing object on the command line, therev_info.cmdlinearray could get a NULL pointer for the value of an 'item' field.
Prevent dereferencing of aNULLpointer in that situation.
matvore )(2018 年 12 月 3 日)。gitster -- 在 commit 6e5be1f 中 merge ,2019 年 1 月 14 日)
exclude-promisor-objects: declare when option is allowed
The
--exclude-promisor-objectsoption causes some funny behavior in at least two commands:logandblame.
It causes a BUG crash:$ git log --exclude-promisor-objects BUG: revision.c:2143: exclude_promisor_objects can only be used when fetch_if_missing is 0 Aborted [134]Fix this such that the option is treated like any other unknown option.
The commands that must support it are limited, so declare in those commands that the flag is supported.
In particular:pack-objects prune rev-listThe commands were found by searching for logic which parses
--exclude-promisor-objectsoutside ofrevision.c.
Extra logic outside ofrevision.cis needed becausefetch_if_missingmust be turned on beforerevision.csees the option or it will BUG-crash. The above list is supported by the fact that no other command is introspectively invoked by another command passing--exclude-promisor-object.
git diff ”时,我们可以预先知道哪个jhowtan )。gitster -- 在 commit 32dc15d 中 merge ,2019 年 4 月 25 日)
diff: batch fetching of missing blobs
When running a command like "
git show" or "git diff" in a partial clone, batch all missing blobs to be fetched as one request.This is similar to c0c578b ("
unpack-trees: batch fetching of missing blobs", 2017-12-08, Git v2.17.0-rc0), but for another command.
derrickstolee )(2019 年 5 月 28 日)。gitster -- merge 于 commit 5d5c46b ,2019 年 6 月 17 日)
sha1-file: splitOBJECT_INFO_FOR_PREFETCH
The
OBJECT_INFO_FOR_PREFETCHbitflag was added tosha1-file.cin 0f4a4fb (sha1-file: supportOBJECT_INFO_FOR_PREFETCH, 2019-03-29, Git v2.22.0-rc0) and is used to prevent thefetch_objects()method when enabled.However, there is a problem with the current use.
The definition ofOBJECT_INFO_FOR_PREFETCHis given by adding 32 toOBJECT_INFO_QUICK.
This is clearly stated above the definition (in a comment) that this is soOBJECT_INFO_FOR_PREFETCHimpliesOBJECT_INFO_QUICK.
The problem is that using "flag & OBJECT_INFO_FOR_PREFETCH" means thatOBJECT_INFO_QUICKalso impliesOBJECT_INFO_FOR_PREFETCH.Split out the single bit from
OBJECT_INFO_FOR_PREFETCHinto a newOBJECT_INFO_SKIP_FETCH_OBJECTas the single bit and keepOBJECT_INFO_FOR_PREFETCHas the union of two flags.
git fetch ”变成了一个懒惰的克隆忘记获取基础对象jhowtan )(2019 年 5 月 14 日)。gitster -- 在 commit 8867aa8 中 merge ,2019 年 6 月 21 日)
index-pack: prefetch missingREF_DELTAbases
When fetching, the client sends "
have" commit IDs indicating that the server does not need to send any object referenced by those commits, reducing network I/O.
When the client is a partial clone, the client still sends "have"s in this way, even if it does not have every object referenced by a commit it sent as "have".If a server omits such an object, it is fine: the client could lazily fetch that object before this fetch, and it can still do so after.
The issue is when the server sends a thin pack containing an object that is a
REF_DELTAagainst such a missing object:index-packfails to fix the thin pack.
When support for lazily fetching missing objects was added in 8b4c010 ("sha1_file: support lazily fetching missing objects", 2017-12-08, Git v2.17.0-rc0), support inindex-packwas turned off in the belief that it accesses the repo only to do hash collision checks.
However, this is not true: it also needs to access the repo to resolveREF_DELTAbases.Support for lazy fetching should still generally be turned off in index-pack because it is used as part of the lazy fetching process itself (if not, infinite loops may occur), but we do need to fetch the
REF_DELTAbases.
(When fetchingREF_DELTAbases, it is unlikely that those areREF_DELTAthemselves, because we do not send "have" when making such fetches.)To resolve this, prefetch all missing
REF_DELTAbases before attempting to resolve them.
This both ensures that all bases are attempted to be fetched, and ensures that we make only one request per index-pack invocation, and not one request per missing object.
jhowtan )(2019 年 8 月 20 日)。gitster -- 在 commit d8b1ce7 中 merge ,2019 年 9 月 9 日)
diff: skipGITLINKwhen lazy fetching missing objs
In 7fbbcb2 ("
diff: batch fetching of missing blobs", 2019-04-08, Git v2.22.0-rc0),diffwas taught to batch the fetching of missing objects when operating on a partial clone, but was not taught to refrain from fetching GITLINKs.
Teach diff to check if an object is aGITLINKbefore including it in the set to be fetched.
chriscool ), Junio C Hamano -- gitster --, _jit_a, _jit_a, _jit_a, _jit_a, commit b9ac6c5, _jit_a, partial-clone documentation , _20A remote that can later provide the missing objects is called a promisor remote, as it promises to send the objects when requested.
Initialy Git supported only one promisor remote, the origin remote from which the user cloned and that was configured in the "
extensions.partialClone" config option.
Later support for more than one promisor remote has been implemented.Many promisor remotes can be configured and used.
This allows for example a user to have multiple geographically-close cache servers for fetching missing blobs while continuing to do filtered
git-fetchcommands from the central server.Remotes that are considered "
promisor" remotes are those specified by the following configuration variables:
extensions.partialClone = <name>remote.<name>.promisor = trueremote.<name>.partialCloneFilter = ...Only one promisor remote can be configured using the
extensions.partialCloneconfig variable. This promisor remote will be the last one tried when fetching objects.
matvore ) 、 Junio C Hamano -- gitster -- 、 commit 627b826 (2019 年 6 月 27 日)作者 commit 95acf11。
- combining filters such that only objects accepted by all filters are shown.
The motivation for this is to allow getting directory listings without also fetching blobs. This can be done by combiningblob:nonewithtree:<depth>.
There are massive repositories that have larger-than-expected trees - even if you include only a single commit.A combined filter supports any number of subfilters, and is written in the following form:
combine:<filter 1>+<filter 2>+<filter 3>
- combining of multiple filters by simply repeating the
--filterflag.
Before, the user had to combine them in a single flag somewhat awkwardly (e.g.--filter=combine:FOO+BAR), including URL-encoding the individual filters.
git diff”学会了在更多不需要 blob 对象的情况下避免延迟加载它们。jhowtan ) 、 Junio C Hamano -- gitster -- 、 commit 8f5dc5a(2020 年 4 月 7 日)和 commit 23547c4(2020 年 4 月 2 日)。jhowtan ) merge ,2020 年 4 月 28 日)
diff: restrict when prefetching occursHelped-by: Jeff King
Signed-off-by: Jonathan Tan
Commit 7fbbcb21b1 ("
diff: batch fetching of missing blobs", 2019-04-08, Git v2.22.0-rc0 -- merge listed in batch #7) optimized "diff" by prefetching blobs in a partial clone, but there are some cases wherein blobs do not need to be prefetched.
In these cases, any command that uses the diff machinery will unnecessarily fetch blobs.
diffcore_std()may read blobs when it calls the following functions:
diffcore_skip_stat_unmatch()(controlled by the config variable diff.autorefreshindex)diffcore_break()anddiffcore_merge_broken()(for break-rewrite detection)diffcore_rename()(for rename detection)diffcore_pickaxe()(for detecting addition/deletion of specified string)Instead of always prefetching blobs, teach
diffcore_skip_stat_unmatch(),diffcore_break(), anddiffcore_rename()to prefetch blobs upon the first read of a missing object.
This covers (1), (2), and (3): to cover the rest, teachdiffcore_std()to prefetch if the output type is one that includes blob data (and hence blob data will be required later anyway), or if it knows that (4) will be run.
gitster -- 的 commit e68f0a4(2020 年 9 月 28 日)和 ojit_a(2020 年 9 月 21 日)。
fetch: do not override partial clone filterSigned-off-by: Jonathan Tan
When a fetch with the
--filterargument is made, the configured default filter is set even if one already exists. This change was made in 5e46139376 ("builtin/fetch: remove unique promisor remote limitation", 2019-06-25, Git v2.24.0-rc0 -- merge listed in batch #3) - in particular, changing from:
- If this is the FIRST partial-fetch request, we enable partial
- on this repo and remember the given filter-spec as the default
- for subsequent fetches to this remote.
to:
- If this is a partial-fetch request, we enable partial on
- this repo if not already enabled and remember the given
- filter-spec as the default for subsequent fetches to this
- remote.
(The given filter-spec is "remembered" even if there is already an existing one.)
This is problematic whenever a lazy fetch is made, because lazy fetches are made using "
git fetch --filter=blob:none(man), but this will also happen if the user invokes "git fetch --filter=<filter>(man)" manually. Therefore, restore the behavior prior to 5e46139376, which writes a filter-spec only if the current fetch request is the first partial-fetch one (for that remote).
关于git - 是否有任何支持部分 checkout /克隆的分布式修订控制系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3098029/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI