天道酬勤,学无止境

git中带有子模块的浅克隆,如何使用指向提交而不是最新提交? [复制](Shallow clone with submodules in git, how to use pointed commits and not latest ones? [duplicate])

问题

我知道使用--depth选项和git submodule update可以有浅子git submodule update

但是,如果我跑

git submodule update --init --recursive --depth 1

在我有几个子模块的项目中,我得到了一个fatal: reference is not a tree 。 所以我又试了一次

git submodule update --init --recursive --depth 100

工作正常,但是我想将深度保持在 1。

在我看来--depth 1提取子模块中的最新提交,而不是主存储库指向的提交,这就是为什么将其设置为 100 解决了问题,因为它提取了更长的提交列表,包括指向的提交.

不幸的是,如果是这种情况,那么我通常无法确定最新的 100 次提交是否包含我需要的提交。

我如何告诉 git 使用指向的提交而不是带有子模块的浅克隆中的最新提交?

我在 Windows 上使用 git 1.9.4。

回答1

不幸的是,似乎没有办法只使用特定的提交 ID 来执行git fetch 。 如果有的话,我真的很想知道。 但是,我以两种不同的方式处理了您的问题:一种,如果可能的话,是在指向我想要的提交的远程存储库上创建一个标记或分支,假设我们称之为“ref”。 这样我就可以获取远程引用,并且--depth将应用于它,而不是最新的提示。 而不是git submodule update --init我做:

git submodule init
git clone --depth 1 -b ref --separate-git-dir .git/modules/sub/ repository sub

其中“sub”是子模块的名称和路径(为简单起见,假设它们相同)

另一种方法,如果您无法在远程存储库中创建标签或分支,则在循环中搜索您想要的提交:

git submodule init
id=$(git submodule status|sed -ne 's/.\([a-z0-9]*\) sub.*/\1/p'
git clone --depth 1 --separate-git-dir -n .git/modules/sub/ repository sub    
cd sub
while ! git rev-list $id ; do
    git fetch --depth $((i+=1))
done
git checkout $id

您可以一次增加不止一次提交以使其运行得更快,但您最终可能会得到一些比您想要的更早的提交。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何制作浅git子模块?(How to make shallow git submodules?)
    问题 可能会有浅层子模块吗? 我有一个包含几个子模块的超项目,每个子模块都有很长的历史,因此不必要地拖累了所有历史。 我所发现的只是这个未回答的话题。 我应该只是破解git-submodule来实现这一点吗? 回答1 即将发布的git1.8.4(2013年7月)的新功能: “ git submodule update ”可以选择浅浅地克隆子模块存储库。 (并且git 2.10 2016年第3季度允许使用git config -f .gitmodules submodule.<name>.shallow true进行记录git config -f .gitmodules submodule.<name>.shallow true 。 请参阅此答案的结尾) 参见commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f: 将--depth选项添加到“ git submodule”的添加和更新命令中,然后将其传递给clone命令。 当子模块很大并且您对除最新提交以外的任何事物都不感兴趣时​​,这很有用。 添加了测试,并对缩进进行了一些调整,以符合“子模块更新可以处理pwd中的符号链接”测试文件的其余部分。 签名人:Fredrik Gustafsson <iveqy@iveqy.com> 演讲人:Jens Lehmann <Jens.Lehmann
  • 如何更新git浅克隆?(How to update a git shallow clone?)
    问题 背景 (有关tl; dr,请参见下面的#questions) 我有多个git信息库浅表克隆。 我使用的是浅层克隆,因为与深层克隆相比,它要小得多。 每个克隆都是围绕git clone --single-branch --depth 1 <git-repo-url> <dir-name> 。 效果很好,除非我看不到如何更新它。 当我通过标签克隆时,更新没有意义,因为标签是冻结的时间点(据我所知)。 在这种情况下,如果要更新,这意味着我想通过另一个标签进行克隆,所以我只需要rm -rf <dir-name>并再次克隆即可。 当我克隆了master分支的HEAD之后又想对其进行更新时,事情变得更加复杂。 我尝试了git pull --depth 1但尽管我不打算将任何内容推送到远程存储库,但它抱怨它不知道我是谁。 我尝试了git fetch --depth 1 ,但是尽管它似乎有所更新,但我检查它不是最新的(远程存储库中的某些文件与克隆文件中的文件具有不同的内容)。 在https://stackoverflow.com/a/20508591/279335之后,我尝试了git fetch --depth 1; git reset --hard origin/master git fetch --depth 1; git reset --hard origin/master ,但有两点
  • Git提交到通用子模块(主分支)(Git commit to common submodule (master branch))
    问题 我有两个或两个以上的项目(我们称它们为ProjectFoo和ProjectBar ),它们具有一些放入子模块中的通用代码。 我的理解是,如果我从ProjectFoo中提交对子模块的更改,它将放在一个独立的头中,只有所有ProjectFoo克隆都可以看到: (master) $ cd ProjectFooBarCommoneSubmodule/ (master) $ git commit -am "Common code fix." (56f21fb0...) $ git push Everything up-to-date 那可能是因为master分支没有改变。 我可能会做类似git checkout master && git merge Everything up-to-date但一切看起来都很丑陋。 可能是git reset --hard master会做同样的事情,但看起来更难看。 如何使项目共享通用代码,并在使用这些代码的项目中对其进行更新? 换句话说,提交到该子模块应该更新使用同一子模块的所有各种存储库(存储库,而不仅仅是克隆)。 - - 编辑 - - 显然我的检出存储库被弄乱了,坏掉了。 它应该从一开始就这样工作(在本示例中是在ProjectFoo上): (master) $ cd ProjectFooBarCommoneSubmodule/ (master)
  • 添加Git子模块时如何指定分支/标签?(How can I specify a branch/tag when adding a Git submodule?)
    问题 git submodule add -b如何工作? 在添加具有特定分支的子模块后,新的克隆存储库(在git submodule update --init )将处于特定提交,而不是分支本身(子模块上的git status显示“当前不在任何分支上”)。 我在.gitmodules或.git/config上.gitmodules有关子模块的分支或任何特定提交的任何信息,那么Git如何解决呢? 另外,是否可以指定标签而不是分支? 我正在使用1.6.5.2版。 回答1 注意:Git 1.8.2增加了跟踪分支的可能性。 请参阅下面的一些答案。 习惯起来有点困惑,但是子模块不在分支上。 就像您说的那样,它们只是指向子模块存储库的特定提交的指针。 这意味着,当其他人签出您的存储库或提取您的代码并进行git子模块更新时,该子模块将签出到该特定提交。 这对于不经常更改的子模块非常有用,因为这样项目中的每个人都可以在同一提交中拥有该子模块。 如果要将子模块移动到特定标签: cd submodule_directory git checkout v1.0 cd .. git add submodule_directory git commit -m "moved submodule to v1.0" git push 然后,另一个想要将submodule
  • 代码管理之git submodule 使用小结
    文章目录 前言功能介绍使用准备工作在github新建两个仓库将子仓库添加至父仓库提交模拟多人协作拉取远程子模块的代码到本地本地子模块修改提交到远程 可能会出现的幺蛾子主模块提交并推送了改动,而子模块并没有推送其他在有子模块的项目中切换分支可能会造成麻烦提交和获取的问题记得先切换分支记得pull完了还得update一下 参考 前言 工作中碰到这样一个场景,一个项目里面的代码分为基础代码和定制化代码,定制化代码是针对不同客户的,基础代码需要和定制化代码分开管理,部署的时候是作为一个项目一起跑的。 我们在这里使用git submodule功能来尝试解决代码的管理问题。 功能介绍 submodule 目前对 git 仓库拆分的已有实现之一。 它允许将一个Git仓库作为另一个Git仓库的子目录。能够将另一个仓库克隆到自己的项目中,同时还保持独立的提交。 功能听上去非常的牛逼,那我们赶紧来试用一下吧! 使用 准备工作 我们将在Github上进行相关功能的操作,并在操作过程中时刻观察仓库状态的变化,加深理解。 首先确保自己有GitHub的账号哈~ 在github新建两个仓库 很简单,像这样 我这里直接使用github新建了一个仓库作为主仓库。 依葫芦画瓢直接在新建两个子仓库,分别起名child1_repo,child2_repo(名字随便起,自己认得就行) 我们把主仓库(以下称parent
  • Git子模块更新(Git submodule update)
    问题 我不清楚以下含义是什么(来自Git子模块更新文档): ...将使子模块HEAD分离,除非指定了--rebase或--merge ... --rebase / --merge如何改变事情? 我的主要用例是拥有一堆中央存储库,这些存储库将通过子模块嵌入到其他存储库中。 我希望能够直接在其原始位置或从其嵌入式存储库(通过子模块使用它们的存储库)内部对这些中央存储库进行改进。 在这些子模块中,是否可以像在常规存储库中一样创建分支/修改并使用推/拉,还是需要谨慎? 我如何将子模块引用的提交从(标记为)1.0提升到1.1(即使原始存储库的头部已经是2.0),还是选择完全使用哪个分支的提交? 回答1 这个GitPro页面确实很好地总结了git子模块更新的结果 当您运行git submodule update ,它签出项目的特定版本,但不在分支中。 这被称为具有分离的头部-这意味着HEAD文件直接指向提交,而不是符号引用。 问题是您通常不希望在独立的头部环境中工作,因为它很容易丢失更改。 如果执行初始子模块更新,则在不创建要使用的分支的情况下提交该子模块目录,然后在不提交的情况下再次从超级项目运行git子模块更新,而Git会在不通知您的情况下覆盖您的更改。 从技术上讲,您不会丢失工作,但不会有指向它的分支,因此检索起来有些困难。 注意:2013年3月: 如“最新的git子模块跟踪”中所述
  • 如何从父克隆中的先前提交中获取git子模块的关联提交ID?(How can I get a git submodule's associated commit ID from a past commit in the parent clone?)
    问题 除了实际签出父提交之外,是否有一种方法可以根据父克隆中的提交ID确定子模块的SHA-1提交ID? 我知道我可以找到当前关联的SHA-1和git submodule 。 这是一个例子: 我有一个带有单个子模块foo的克隆,该克隆在上个月进行了多次更改。 我在父克隆中有一个标签,该标签已有几周的历史了,称为released-1.2.3 。 我想找出此标记的提交与foo的关联SHA-1是什么。 我可以简单地查看released-1.2.3并使用git submodule来查看,但是我想知道是否有一种方法可以在不影响工作树的情况下进行脚本编写。 我想这样做是因为我想构造一个脚本来对父存储库中两次提交之间的子模块中的所有更改执行“ diff”操作,即“告诉我在父模块中两次提交之间子模块foo文件已更改。” 回答1 您可以使用git-ls-tree查看给定提交期间给定路径的SHA-1 ID: $ git ls-tree released-1.2.3 foo 160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398 foo (我的第一个想法是git show released-1.2.3 foo ,但是以“致命:坏对象”失败。) 由于您正在编写输出脚本,因此您可能只想单独获取SHA-1 id,例如: $ git ls-tree
  • 在两个或多个 Rails 应用程序之间共享代码……git 子模块的替代方案?(Sharing code between two or more rails apps… alternatives to git submodules?)
    问题 我们有两个单独的 rails_app, foo/和bar/ (分开是有充分理由的)。 它们都依赖于common/文件夹中的某些模型等,当前与foo和bar平行。 我们当前的 svn 设置使用svn:externals来共享common/ 。 这个周末我们想尝试一下 git。 经过大量研究,似乎解决此问题的“犹太洁食”方法是使用git submodule 。 我们在将foo 、 bar 、 common分离到单独的存储库后开始工作,但随后实现了所有附加的字符串: 在提交父模块之前总是提交子模块。 在推送父模块之前总是推送子模块。 在提交之前确保子模块的 HEAD 指向一个分支。 (如果您是 bash 用户,我建议您使用 git-completion 将当前分支名称放在您的提示中。) 在切换分支或拉取更改后始终运行“git submodule update”。 所有这些问题比add 、 commit 、 push更复杂。 我们正在寻找更简单的方法来共享 git 中的common 。 这家伙似乎在使用 git subtree 扩展方面取得了成功,但这与标准 git 的不同并且看起来仍然不那么简单。 鉴于我们的项目结构,这是我们能做的最好的事情吗? 我对 Rails 插件/引擎的了解还不够多,但这似乎是一种可能的 RoR 式共享库方式。 提前致谢。 回答1 我认为 git
  • 我应该如何使用 EGit 处理多模块 Maven 项目?(How am I supposed to work with multi-module Maven projects with EGit?)
    问题 我尽力使用 EGit 将多模块 Maven 项目与 GitHub 同步,但我失败了。 项目的结构是这样的: 父母(pom) 儿童一(罐) 孩子二(罐子) 我尝试了这个简单的方法: Eclipse JDT 的完全空白副本和一个空的工作区创建一个新的 GitHub 存储库并使用README.md文件对其进行初始化将该存储库克隆到 Eclipse 创建父(pom)项目创建两个子(jar)项目,添加简单的主类,此时一切正常 现在是棘手的部分。 我是否只共享我的父项目? 还是孩子也一样? 好吧,我认为只共享父级似乎是合乎逻辑的。 然而,当我这样做时,我的构建路径变得完全疯狂,Eclipse 无法再找到主类。 然后我重新启动了 Eclipse。 问题一直存在。 然后我将项目与存储库“断开连接”,并在逻辑上EGit 随机删除了文件系统上的一个子项,并使 Eclipse 项目完全无法使用(不会显示任何类,所有结构都消失了)。 我以前有一个插曲,EGit 随机删除了我的一个存储库,那次它不仅仅是一个测试,它是我对代码库的实际最新更改。 这个插头是完全出问题了还是我遗漏了什么? (我按照基本教程进行了设置,并正确配置了我的 SSH 密钥。) 我应该怎么做才能正确地将本地 Maven 多模块项目推送到 GitHub,并能够将其克隆到完全不同的 PC 上? 回答1 实际上,这是 100% 可能的!
  • 史上最简单的Git入门教程
    1. 版本控制系统简介 1.1 何为版本控制 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了已录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。 下面举一个简单的例子,大家都用过office word写过文档,在写文档的过程中,可能需要删除原有文档的某一个段落,但又担心该段落之后会再次用到,所以,新建一个文档的副本,然后进行修改。之后,可能会循环重复该流程多次,那么我们的文档库可能就会变成下面的这个样子: 过了一段时间,你可能需要找回某次删除的内容,但是,你已经记不清修改到底在哪个文档中,只能一个一个的查阅。如果文档的版本特别的多的话,相信这种查找的过程会让你抓狂。而且,这些不同版本的文档,不论何时你都是不该删除的,因为,你不知道未来的哪个时间,你可能就会再次用得到。 最原始的代码管理方式与上面的情况类似。 传统文档/代码管理方式的缺点: 版本管理混乱; 版本回退繁琐; 版本合并困难; … … 版本控制系统就是为了解决类似于上面的问题而发明的
  • 简单的方法来提取所有git子模块的最新信息(Easy way to pull latest of all git submodules)
    问题 我们正在使用git子模块来管理几个依赖于我们开发的其他许多库的大型项目。 每个库都是一个单独的存储库,作为子模块引入到相关项目中。 在开发过程中,我们经常只想获取每个依赖子模块的最新版本。 git有内置命令可以做到这一点吗? 如果不是,那么可以执行Windows批处理文件或类似文件? 回答1 如果这是您第一次签出--init需要先使用--init : git submodule update --init --recursive 对于git 1.8.2或更高版本,添加了--remote选项以支持更新到远程分支的最新提示: git submodule update --recursive --remote 这具有.gitmodules或.git/config文件中指定的任何“非默认”分支的附加好处(如果碰巧有任何分支,默认为origin / master,在这种情况下,此处的其他一些答案也可以作为出色地)。 对于git 1.7.3或更高版本,您可以使用(但以下有关更新的陷阱仍然适用): git submodule update --recursive 或者: git pull --recurse-submodules 如果您想将子模块拉到最新的提交,而不是当前的提交,则回购指向。 有关详细信息,请参见git-submodule(1)。 回答2 git pull -
  • 如何仅更新特定的git子模块?(How to only update specific git submodules?)
    问题 因此,更新所有我的子模块是通过运行 git submodule foreach 'git pull origin master' 如何更新位于bundle/syntastic的特定子模块,而不更新任何其他子模块? 回答1 最后,我搜索如何仅更新特定的子模块,这对我而言意味着将子模块更新为其超级仓库所指向的ref。 这不是问题也不是答案,而只是标题。 因此,希望对其他像我这样的人有所帮助,问题标题的答案是: git submodule update <specific path to submodule> 这将使该子模块处于在超级仓库中提交的ref的状态。 回答2 实际上,正确的语法是: $ git clone <remote.git> $ cd <remote> $ git submodule update --init -- <specific relative path to submodule> 回答3 从git子模块文档 --remote此选项仅对update命令有效。 不要使用超级项目记录的SHA-1更新子模块,而要使用子模块的远程跟踪分支的状态。 所使用的远程是分支的远程(branch..remote),默认为源。 为了更新特定的子模块,您可以使用: git submodule update --remote <path to the submodule>
  • 刷新 repo 中最新的 git 子模块(Refreshing the latest git submodule in repo)
    问题 我有点像 git newb,所以请耐心等待。 我有一个项目有一个需要刷新的子模块。 该项目正在使用子模块的第 1 版,并且有更改,因此我想将其更改为使用最新版本。 如何刷新子模块并应用更改,以便从项目中克隆或提取的其他用户将使用最新的更新版本 1.5? 这是该项目的外观: ProjectA:远程仓库配置为 repoA 它依赖于一个指向 repoB 的子模块。 项目根目录下的 .git/config 文件如下所示: [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = git@/github.com/foo/foo.git 项目根目录下还有 .gitmodules 文件: [submodule "Vendor/some-external-library"] path = Vendor/some-external-library url = https://github.com/some-external-library/some-external-library.git 在“some-external-library”目录中,没有 .gitmodules 文件,只有带有相应文件的标准 .git 目录。 .git/config 指向 repoB。 回答1 子模块实际上是在您的主存储库中检出的 git
  • 如何追踪未追踪的内容?(How to track untracked content?)
    问题 有关我的原始问题,请参见以下实线。 我的本地目录中有一个未跟踪的文件夹。 当我运行git status ,我得到: Changed but not updated: modified: vendor/plugins/open_flash_chart_2 (modified content, untracked content) 当我键入git add vendor/plugins/open_flash_chart_2然后再次尝试git status时,它仍然显示未跟踪。 这是怎么回事? 这是我最近一个半小时的简单摘要: 发现我的Github存储库未跟踪我的vendor/plugins/open_flash_chart_2插件。 具体来说,没有内容,并且在文件夹图标上显示了绿色箭头。 尝试git submodule init No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2' 尝试使用git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2 vendor/plugins/open_flash_chart_2
  • Git不会初始化/同步/更新新的子模块(Git will not init/sync/update new submodules)
    问题 这是我的.gitmodules文件内容的一部分: [submodule "src/static_management"] path = src/static_management url = git://github.com/eykd/django-static-management.git [submodule "external/pyfacebook"] path = external/pyfacebook url = http://github.com/sciyoshi/pyfacebook.git 但是, .git/config仅包含第一个: [submodule "src/static_management"] url = git://github.com/eykd/django-static-management.git 第二external/pyfacebook模块( external/pyfacebook )是由另一个开发人员在功能分支中添加的。 我现在继承了开发,并签出了功能分支。 但是,Git不会为我拉子模块。 我试过了: git submodule init git submodule update git submodule update --init git submodule sync 从.git/config删除所有子模块定义,然后运行git
  • 如何更改git子模块的远程存储库?(How to change the remote repository for a git submodule?)
    问题 我创建了一个git存储库,其中包含一个子模块。 我能够告诉子模块本身更改其远程存储库路径,但是我不确定如何告诉父存储库如何更改子模块的远程存储库路径。 如果我有点不走运并且必须手动执行操作,我不会感到惊讶,因为即使删除子模块也不容易。 回答1 您应该只能够编辑.gitmodules文件来更新URL,然后运行git submodule sync --recursive将更改反映到超级项目和工作副本中。 然后,您需要转到.git/modules/path_to_submodule目录,并更改其配置文件以更新git路径。 如果回购历史记录不同,那么您需要手动签出新分支: git submodule sync --recursive cd <submodule_dir> git fetch git checkout origin/master git branch master -f git checkout master 回答2 这些命令将在命令提示符下完成工作,而不会更改本地存储库中的任何文件 git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git git config --file=.gitmodules submodule.Submod.branch
  • Git与SVN对比
    一、基本介绍Git是目前世界上最先进的分布式版本控制系统,其实 Git 跟 SVN一样有自己的集中式版本库或服务器,但是Git 更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个跟中心版本库一模一样的本地版本库。SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器!这是两者之间最核心的区别。SVN只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。Git每一个终端都是一个仓库,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。每一次的提取操作,实际上都是一次对代码仓库的完整备份。Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应Git提供的一些概念和特征。二、集中式版本控制与分布式版本控制集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆
  • 预加载git存储库?(Pre-load git repository?)
    问题 如果我已经在本地拥有相同的文件,是否可以从文件中“预加载”本地的文件,而不是从远程存储库中提取较大的文件目录? 我已经在本地拥有与远程文件相同的文件,只是它们不在本地存储库中。 这是我的情况: 我有一个远程网站,其中包含大量(很多演出)资源(图像,PDF,swfs,flvs)目录。 我已经为此远程站点设置了一个git存储库,并使用.gitignore文件从存储库中排除了大资源目录,从而在本地克隆了它。 我现在想将大资源目录作为远程回购的一部分,但这将大大增加回购的大小,当我执行下一个本地请求时,我将等待很长时间。 所以我基本上希望有一种方法可以告诉git“我要问你拉回那个突然变得更大的仓库,但我已经掌握了使它如此庞大的大部分内容了”? 还是这可能会反过来,先将文件添加到本地存储库中,然后以某种方式将存储库计算出来,因为它们具有相同的文件,无需传输? 当将新的开发人员带入一个大型项目时,这也将派上用场,并且大部分项目可以通过DVD提供,而不必克隆/下载庞大的回购协议。 回答1 我建议您要养成习惯,不要在git-annex之类的选项中添加千兆字节的二进制文件到git中。 现在。 仅本地拥有文件本身不足以让Git使用它们。 您可以使用git hash-object手动将大型二进制文件添加到网络划分较大的一侧的Git的对象数据库中,并在另一侧创建一个包含完全相同的文件的提交
  • 使当前提交成为Git存储库中唯一的(初始)提交?(Make the current commit the only (initial) commit in a Git repository?)
    问题 我目前有一个本地Git存储库,我将其推送到Github存储库。 本地存储库有大约10个提交,而Github存储库是它的同步副本。 我想做的是从本地Git存储库中删除所有版本历史记录,因此存储库中的当前内容显示为唯一的提交(因此不会存储存储库中较旧版本的文件)。 然后,我想将这些更改推送到Github。 我已经研究了Git变基,但是这似乎更适合删除特定版本。 另一个可能的解决方案是删除本地存储库,然后创建一个新的存储库-尽管这可能会导致很多工作! 预计到达时间:有些特定的目录/文件无法跟踪-如果可能的话,我想保持对这些文件的跟踪。 回答1 这是蛮力方法。 它还会删除存储库的配置。 注意:如果存储库包含子模块,则此方法不起作用! 如果您正在使用子模块,则应使用例如交互式变基 步骤1:删除所有历史记录(确保已备份,无法还原) cat .git/config # note <github-uri> rm -rf .git 步骤2:仅使用当前内容重建Git存储库 git init git add . git commit -m "Initial commit" 步骤3:推送至GitHub。 git remote add origin <github-uri> git push -u --force origin master 回答2 唯一适用于我(并使子模块保持工作状态)的解决方案是
  • 如何以干净的方式分叉现有的 Meteorite 包?(How to fork an existing Meteorite package in a clean way?)
    问题 我正在尝试找出在项目中在 Atmosphere 上分叉现有包的最佳/最干净的方法。 我遇到过一些现有包需要修改的情况,我被迫分叉它。 据我所知,存在以下选项。 不幸的是,所有这些都有自己的问题,我还没有找到完美的解决方案。 我将以meteor-router为例: 1. 只需将包文件复制到您的包文件夹中 脚步: 删除packages/router/.git/ 编辑packages/.gitignore并删除“路由器”行从smart.json删除路由器将packages/router添加到您的项目存储库并提交现在进行更改(这样您的初始提交是一个干净的版本,您可以自己计算出更改的内容) 好处: 易于实现和理解您所依赖的所有代码都可以在您的项目存储库中找到 缺点: 您丢失了所有原始存储库历史记录很难更新到新版本很难将您的更改贡献回原始项目 除了最简单的包,甚至不要考虑这个! 2.在github上fork,然后... 要在 github 上 fork 一个包,您可以检查您的smart.lock文件以查看正在使用哪个存储库。 转到该存储库的 github 页面并对其进行分叉。 接下来,您有三个选择: 2a. 将其添加为 git 子模块 有关 git 子模块的更多信息:http://git-scm.com/book/en/Git-Tools-Submodules 脚步: