繁体   English   中英

Git:有没有一种安全的方法可以删除分支,包括从分支中的所有提交/历史恢复原始仓库的大小

[英]Git: Is there a safe way to delete a branch, including all commits/history from it to restore original repo size

我有人要求使用Git一次性传输大型二进制文件(在2个人之间传输文件)。 他遇到了一些网络问题,无法使用标准工具(例如Dropbox,GDrive,Ftp等),但与我的Git存储库完全连接。

我对允许他这样做的最大担心是,这将增加我的回购规模。 即使他创建了一个新分支,使用二进制文件进行提交,并在另一方成功拉出该分支后将其删除,回购协议是否也不会保留与该提交相关的历史记录?

如果文件很大(100M),即使删除分支,我的仓库也不会增加那个数量吗? 我需要怎么做才能将仓库重新缩小到预先提交的大小?

一旦一些的所有引用提交(S)和其相关的文件(S)-really,-are了基本的Git对象(即那些提交去树木和斑点),对象符合垃圾收集。 但是, 只有在运行git gc (或git prune并且它们至少与“修剪时间”一样长的时候它们才真正收集。

默认修剪时间为两周,但是您可以使用git gc --prune=yesterday--prune=10.minutes.ago或类似的方法来--prune=10.minutes.ago修剪时间。 如果您将时间缩短,请确保没有人在存储库中创建新对象。

摆脱对各种Git对象的所有引用可能比看起来困难。 显而易见的是分支名称和标记名称。 这些引用名称通常还具有reflog ,并且HEAD本身还有一个附加的reflog。 所有这些引用日志都包含引用,这些引用随后使对象保持活动状态。 删除分支名称(当前)将删除分支的引用日志,但HEAD的引用日志中的名称仍保留。

缺省情况下,reflog条目本身将在90天后过期(对于可到达对象而言),而在30天(对于 可达对象)将过期,而此可达性取决于相应引用的当前值。 如果对提交的唯一引用是在HEAD引用日志中,并且HEAD本身并未分离,那么该引用引用将指向无法到达的提交(根据定义:如果HEAD附加到分支,则HEAD仅包含分支名称,而我们已经表示没有分支名称指向提交本身,也没有指向提交的后代),因此仅适用较短的有效期。 您可以使用git reflog expire --expire-unreachable=...进一步缩短它,使用与git gc --prune=...相同的语法,尽管您当然会过期所有这些无法访问的reflog条目,除非您限制这到HEAD (那么您将只剔除HEAD的不可达条目)。

除了这些以外,还可以在特殊的*_HEAD名称( ORIG_HEADMERGE_HEADCHERRY_PICK_HEAD等)中进行CHERRY_PICK_HEAD 但是,对于这种特殊情况,这不太可能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM