大多数CI服务提供了一种浅层克隆存储库的方法.例如,在特拉维斯:
git:
depth: 1
Run Code Online (Sandbox Code Playgroud)
或者在AppVeyor上:
clone_depth: 1
or
shallow_clone: true
Run Code Online (Sandbox Code Playgroud)
这有明显的速度优势,因为您不必克隆整个存储库.
CI服务的浅层克隆是否有任何缺点?是否存在浅层克隆会导致CI构建失败的情况?否则,为什么不浅层克隆这些CI服务的默认设置?
我正在尝试取消浅层存储库:
% /bin/git clone --shallow-since='3 years' 'https://github.com/RobertAudi/zsh-hooks'
Cloning into 'zsh-hooks'...
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 17 (delta 6), reused 12 (delta 4), pack-reused 0
Unpacking objects: 100% (17/17), 5.29 KiB | 1.76 MiB/s, done.
% cd zsh-hooks && git remote -v
origin https://github.com/RobertAudi/zsh-hooks (fetch)
origin ssh://github.com/RobertAudi/zsh-hooks (push)
% git fetch --unshallow origin
fatal: error in object: unshallow 9301f4e3a16df8e7cf8f37b5b93a7b925d8c8bee
fatal: the remote end hung up unexpectedly
Run Code Online (Sandbox Code Playgroud)
我也尝试过将原点更改 …
我的目标是能够构建一个具有悠久历史的项目的最新版本并为之做出贡献 - 并且不使用本地存储来复制许多历史分支和历史可以追溯到十年甚至更长时间(无论如何,我总是可以在项目的中央存储库的Web UI中查找,如果我需要的话,我可能不会这样做.
我第一次尝试时似乎很幸运:
git clone --depth 40 -b master http://github.com/who/what.git/ what
Run Code Online (Sandbox Code Playgroud)
这给了我一个整洁的本地克隆'什么'只有' master'分支,并有足够的承诺来涵盖最近的两个标记版本.
然后我可以做' git checkout latest-release-tag并构建最新版本.yippee的!
正如我想象的那样,我需要做一个补丁.一切顺利进行:' git checkout -b my-patch-branch',进行我的更改,提交,我能够将我的补丁分支推回到github上的克隆,以便项目可以拉动它.简单!
我觉得我很幸运,因为根据我的阅读,例如,在这里,我不能在git 1.9之前做到这一点.
但安装的版本竟然是1.9,所以我侥幸成功.
现在我要做的下一个显而易见的事情是从远程获取并获取master上的最新活动(包括我的补丁的上游合并,所以我不再需要该分支).我尝试了'git fetch --dry-run upstream'并惊恐地看着它无数兆字节的下载,然后给了我一个新的标签列表,可以追溯到乳齿象时代.我很高兴我说--dry-run!
我真的希望它能master从我的克隆的HEAD中获得十几个新的提交,然后我可能会有一个深度52克隆而不是40,但这就是我想要的......在我介入之前,先从有用的近期历史开始,然后从这一点开始跟踪和增长,并能够构建,分支和推送补丁.它似乎非常接近.
有没有简单的方法让git做我想做的事情?我想做的不合理吗?
编辑:更多信息.
(1)上流实际上是靠近我提前一百次,我估计十几次被拉出空中.
(2)事实证明,我在克隆中获得的原始40次提交都是单父提交.我正在尝试获取的一堆后者是在我的克隆不包含的某个分支中与第二个父进行合并提交.因为我克隆中最早的提交不是一个共同的祖先,那些是否会导致git引入他们所有的古代历史?
有没有办法告诉它我不想要那个?
更多新信息:
(1)我之前发现我之前使用的是http协议,它实际上并没有与服务器上的git进程交互,所以它没有机会定制下载大小.
但是,当我使用git-over-ssh重试时,我仍然有一个巨大的提取.
然后
(2)手动,就像动物一样,我点击了github的'newtork'显示中显示的合并提交,找到涉及在我的浅切之前开始的分支的那些,并将他们的父-2 SHA添加到我的.git/shallow文件中,然后尝试再次在ssh上'git fetch'.这很好用,并下载了一个小包文件,可以快速转发我当地的master分支机构.我认为这正是我想要git能够自动完成的操作,但我还没有找到办法.手动,这很乏味.:)
如果我在一个标签上克隆一个最大深度为1的存储库,它就能正常工作并向下拉.如果我想为新标记执行带有或不带深度1的提取,它会进行一些处理,但标记永远不会显示在"git tag"下.如果我提供--tags选项,它会下载整个存储库而不仅仅是新信息.我不介意存储库获取更多历史记录,我只是想避免下载时间.有没有办法在没有从浅克隆存储库中获取所有标记的情况下获取新标记?
git clone --branch 1.0 --depth 1 repositoryPath
git fetch --depth 1 origin tags/1.1 # Does processing but no new tags
git fetch --tags origin tags/1.1 # Pulls down the rest of the repository and adds all tags
git fetch --depth 1 --tags origin tags/1.1 # Same as above
Run Code Online (Sandbox Code Playgroud)
现在,我在文档中注意到了这一点:" - 深度...不会提取深化提交的标签."
这是我遇到的问题吗?除了下载所有标签之外,还有办法吗?
我了解到,当使用Object.assign()时,它只扩展顶级对象.我怎样才能深度扩展对象?例如,假设我有以下源对象:
const source = {
id: 1,
otherKey: {},
params: {
page: {
a: 1,
b: {}
},
data: {
b: 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
我这样使用Object.assign():
Object.assign({}, source, {
params: {
page: {
a: 2
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果将是:
{
id: 1,
otherKey: {},
params: {
page: {
a: 2
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何以浅克隆方式保留params.data键和params.page.b键.
oldObject.params.data === newObject.params.data // true
oldObject.params.page === newObject.params.page // false
oldObject.params.page.b === newObject.params.page.b // true
Run Code Online (Sandbox Code Playgroud)
注意:此问题与如何深度合并而不是浅合并不同.那里的答案没有给出预期的结果.
检查此bin从上面的链接中获取答案.
我想克隆一个历史悠久的存储库。我只对一些短暂的尚未合并的功能分支和master.
为了不让自己与所有过去的历史和合并的分支混淆,我想从特定的提交 SHA 开始进行浅层克隆。
但是,到目前为止,我只找到了有关如何进行浅层克隆的文档,这些克隆仅包括最后一次n提交 ( --depth) 和自特定日期 ( --shallow-since)以来的提交。
有没有办法指定从给定提交开始的浅克隆?
我已经“浅化”了一个回购协议:
\n\nFIRST_COMMIT="bf450342272a94117d78eae34a140a2a39359dad"\ngit rev-parse ${FIRST_COMMIT} > .git/shallow\ngit fsck --unreachable\ngit gc --prune=now\nRun Code Online (Sandbox Code Playgroud)\n\n现在我尝试推动:
\n\n! [remote rejected] develop -> develop (shallow update not allowed)\nRun Code Online (Sandbox Code Playgroud)\n\n我知道这个限制是由于回购协议很浅造成的。
\n\n如何将浅层仓库转换为普通仓库?
\n\n我不在乎失去旧历史。其实我想丢掉旧历史
\n\n为了澄清这一点:
\n\n简单地删除该.git/shallow文件是行不通的:
\xc2\xbb git push -f --set-upstream myorigin develop\nerror: Could not read d18d4a247bebd32a3b57b2c0e5f9c28749083211\nfatal: revision walk setup failed\nerror: remote unpack failed: eof before pack header was fully read\nerror: failed to push some …Run Code Online (Sandbox Code Playgroud) 我有一个使用 MSBuild 构建解决方案的 Jenkins 服务器。浅克隆未启用(在高级克隆行为上),所以我认为它正在获取所有最后的提交。我正在使用 SonarQube 进行分析。我设置在构建之前运行开始分析,并在构建完成后运行结束分析。SonarQube 分析成功完成,但我收到警告:
分析过程中检测到浅克隆。某些文件会丢失 SCM 信息。这将影响自动分配问题等功能。请配置您的构建以禁用浅克隆。
有人知道我缺少什么 SonarQube 工作正常吗?
我发现了很多关于克隆存储库并立即检查给定提交 ID 的问题/答案。简单的方法:
git clone <URL> working-copy
cd working-copy; git checkout <COMMIT-ID>
Run Code Online (Sandbox Code Playgroud)
通过分支机构,您可以git clone -b <BRANCH> <URL>
使用分支,您还可以进行浅克隆,这使得克隆速度更快,但您无法再检出任意 ID。
所以我的问题是:有没有一种方法可以对给定的 URL/提交 ID 进行浅表克隆,而无需在远程创建分支?
不同类型的远程存储库有区别吗?(例如本地文件系统、BitBucket、GitHub、GitLab 等)
我们读到了有关git狭窄克隆 的内容。假设我们想在极端情况下使用这一新功能,并且只需使用最小的带宽即可从大型远程存储库编辑一个文件并推迟我们的提交。
人们发现的唯一示例是
git clone --no-checkout --filter=blob:none "file://$(pwd)/srv.bare" pc1
让我们添加 --深度 1 以节省更多数据流量和磁盘空间。但是我们如何指定单个远程 文件
而不触发“似乎不是 git 存储库”错误呢?git 版本 2.17.0.290。
shallow-clone ×10
git ×9
git-clone ×3
appveyor ×1
commit ×1
github ×1
javascript ×1
jenkins ×1
shallow-copy ×1
sonarqube ×1
travis-ci ×1