2017-06-01 40 views
1

我克隆下我的工作区中的‘第三方软件’的子目录许多第三方项目混帐回购协议,但我不想让任何历史从他们(最新的快照会做);还有,我在不同的版本库许多项目共享相同的许多子模块(如清洁过滤器,预提交脚本...等)和不希望保留的历史在其中任何一个。如何使一个Git仓库或子浅

这里有两个相似但略有不同的问题:

  • 是否有任何命令来使这些git仓库删除所有历史记录快照?
  • 是否有任何git配置(或其他方法)强制git存储库/子模块只有保留最新的快照后每个未来的拉/子模块更新?

谢谢。

+0

也许谷歌的gclient从https://chromium.googlesource.com/chromium/tools/depot_tools/做你想做的。 – marcolz

+0

https://stackoverflow.com/a/17692710/3040162是使用浅层子模块的综合答案。我不推荐使用它 - 将--depth参数传递给git clone,确定子模块固定版本所需的确切深度几乎是不可能猜到的,并且是一个移动的目标。如果你的git服务器允许直接读取提交SHA,那么只有这样才可行。 – ad22

回答

0

第1个答案:

删除.git文件夹可能会导致你的git仓库的问题。如果你想删除所有提交的历史,但保持代码在当前状态下,它是很安全的做如下所示:

  1. 结帐

    git checkout --orphan latest_branch

  2. 添加所有文件

    git add -A

  3. 提交更改

    git commit -am "commit message"

  4. 删除分支

    git branch -D master

  5. 命名当前分支掌握

    git branch -m master

  6. 最后,力更新你的资料库

    git push -f origin master

注:

这会不会让你的旧提交历史周围

第2个答案:

您可以克隆您当前的git存储库在每次提交或提交之前存放到不同文件夹中的本地存储库。

语法:

git clone -l -s -n [sourceFolder] [destinationFolder] 

实施例:

git clone -l -s -n . ../repo-backup 

注:

-l =当从克隆库是在本地机器上

-s =当克隆存储库位于本地计算机上而不是使用硬链接时,自动设置.git/objects/info/alternates 以与源存储库共享对象。

-n =克隆完成后,不执行HEAD的签出。

0

您可以运行git fetch并使用--depth将现有(非浅层)存储库转换为给定深度的浅存储库。您可能还想删除除一个分支名称(一个本地分支和一个相应的远程跟踪分支)以外的所有分支,并更改要匹配的fetch =指令。如果有标签,你可能想要修剪一些或全部。您保留的任何引用将保留提交及其引用的对象。

这是罚款的规则库,但作为VonC noted in his answerGit shallow submodulesad22 mentioned in a comment

...确定所需的辅助模块固定修订的确切深度几乎是不可能的猜测,是一个移动的目标

如果你控制的服务器,并有足够新的Git,您可以启用获取,通过散列-ID这将使该子模块散列的ID直接取出,这将解决这一点。如果不是 - 如果你不控制服务器或者你的Git不是那么新的,你会发现再次获得他们的“sob-modules”昵称的子模块。