我克隆下我的工作区中的‘第三方软件’的子目录许多第三方项目混帐回购协议,但我不想让任何历史从他们(最新的快照会做);还有,我在不同的版本库许多项目共享相同的许多子模块(如清洁过滤器,预提交脚本...等)和不希望保留的历史在其中任何一个。如何使一个Git仓库或子浅
这里有两个相似但略有不同的问题:
- 是否有任何命令来使这些git仓库删除所有历史记录快照?
- 是否有任何git配置(或其他方法)强制git存储库/子模块只有保留最新的快照后每个未来的拉/子模块更新?
谢谢。
我克隆下我的工作区中的‘第三方软件’的子目录许多第三方项目混帐回购协议,但我不想让任何历史从他们(最新的快照会做);还有,我在不同的版本库许多项目共享相同的许多子模块(如清洁过滤器,预提交脚本...等)和不希望保留的历史在其中任何一个。如何使一个Git仓库或子浅
这里有两个相似但略有不同的问题:
谢谢。
第1个答案:
删除.git
文件夹可能会导致你的git仓库的问题。如果你想删除所有提交的历史,但保持代码在当前状态下,它是很安全的做如下所示:
结帐
git checkout --orphan latest_branch
添加所有文件
git add -A
提交更改
git commit -am "commit message"
删除分支
git branch -D master
命名当前分支掌握
git branch -m master
最后,力更新你的资料库
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的签出。
您可以运行git fetch
并使用--depth
将现有(非浅层)存储库转换为给定深度的浅存储库。您可能还想删除除一个分支名称(一个本地分支和一个相应的远程跟踪分支)以外的所有分支,并更改要匹配的fetch =
指令。如果有标签,你可能想要修剪一些或全部。您保留的任何引用将保留提交及其引用的对象。
这是罚款的规则库,但作为VonC noted in his answer到Git shallow submodules和ad22 mentioned in a comment:
...确定所需的辅助模块固定修订的确切深度几乎是不可能的猜测,是一个移动的目标
如果你控制的服务器,并有足够新的Git,您可以启用获取,通过散列-ID这将使该子模块散列的ID直接取出,这将解决这一点。如果不是 - 如果你不控制服务器或者你的Git不是那么新的,你会发现再次获得他们的“sob-modules”昵称的子模块。
也许谷歌的gclient从https://chromium.googlesource.com/chromium/tools/depot_tools/做你想做的。 – marcolz
https://stackoverflow.com/a/17692710/3040162是使用浅层子模块的综合答案。我不推荐使用它 - 将--depth参数传递给git clone,确定子模块固定版本所需的确切深度几乎是不可能猜到的,并且是一个移动的目标。如果你的git服务器允许直接读取提交SHA,那么只有这样才可行。 – ad22