【问题标题】:Copy git repository from usb (fat32) to hdd looses commits将 git 存储库从 usb (fat32) 复制到 hdd 丢失提交
【发布时间】:2018-02-23 07:18:48
【问题描述】:

我在 U 盘上有一个 git 存储库,想将它复制到我的硬盘上。我尝试使用rsync -rXPcp 和 ubuntu 中的 gui 复制它,但在复制的版本上,所有提交似乎都消失了。当我输入 git loggit reflog 时,我得到了

fatal: your current branch 'master' does not have any commits yet

文件 .git/logs/HEAD 显示所有提交,但 git 看不到它们。

如何在不丢失任何数据的情况下移动存储库?

编辑1+3+5: 使用的命令:

  • rsync -rXP usb_folder/ hdd_folder
  • cp -rp usb_folder hdd_folder (hdd_folder 位于 /home)
  • rsync -a usb_folder/ hdd_folder
  • 使用sudo chownsudo chmod -v -R a+rwx usb_folder 更改所有权+ 复制。文件权限实际上并没有改变(事实证明这在 fat32 文件系统上不起作用,应该知道 -.-')

当我将存储库复制到同一个 U 盘上的新文件夹时,提交仍然存在

EDIT2:

我不想使用git clone,原因是提到了here,因为我有一堆我需要测试的未跟踪文件

编辑4:

存储库可能是用 git for Windows 创建的。 Windows 行尾或版本有问题?提交存在于 USB 记忆棒上

EDIT5:

这似乎是文件系统的问题(USB 记忆棒是 fat32)和/或 Windows 的 git(存储库可能是用 Windows 的 git 创建的)。我可以将存储库复制到 Windows 10 pc 和 git bash 中的git log 将正确显示所有提交。如果我使用 ubuntu 子系统检查,所有提交都消失了(尽管某些文件由于某种原因暂存)

【问题讨论】:

  • 您输入的确切命令是什么?
  • rsync -rXP usb_folder/ hdd_folder, cp -rp usb_folder hdd_folder。不使用 X (rsync) 和 p (cp) 标志会得到相同的结果。如果我将文件夹复制到同一个 U 盘上的文件夹中,提交仍然存在
  • git clone 会这样做。
  • 我无法重现这个。我会同意@DonBranson 的评论。
  • 您应该在问题中提及为什么您不想以正常方式执行此操作。

标签: git ubuntu-16.04


【解决方案1】:

检查源和目标上的 Git 版本。

虽然基本的 Git 存储库格式没有太大变化,但一些重要的事情发生了变化。可能最重要的是,包文件更为普遍。特别是packed refs 可能会导致Git 看不到master。

如果它们显着不同,请确保它们匹配,可能通过升级目标。

克隆它并修复它。

如果这不起作用,请使用git clone。然后根据自己的喜好修复克隆。

虽然一个简单的cp -a 通常足以复制一个 git 存储库,但可能有许多问题导致您的问题。由于您要从 Windows 移动到 Unit,因此它可能是行尾。可能是权限。可能是您的源 git 版本和目标 git 版本如此不同,您的 Ubuntu 版本没有完全理解它。

git clone 将为您处理这些内部 git 存储库格式问题。根据自己的喜好调整克隆所花费的时间和精力要比找出副本不起作用的原因要少得多。

如果您的 repo 处于如此活跃的开发状态,您可能不应该将您的 repo 复制到另一台机器上,以至于您需要像 reflog 和 stash 这样的东西。如果这是一个大问题,请将旧的 repo 保留一段时间。

复制一个活跃的开发仓库是非常罕见的,所以手动复制没什么大不了的。如果您发现自己经常这样做,在我质疑您的工作流程发生了什么之后,您可以编写一个脚本。

至于修复the individual concerns with cloning an active repo,这里是如何处理它们的。

它为克隆存储库中的每个分支创建远程跟踪分支。

git remote rm origin

任何远程分支和其他引用都会被完全忽略。

git remote -v 并使用git remote add 重新创建它们。你可能只有一个。

如果你有钩子,你不会得到你的钩子,你可能会忘记你有它们!

复制.git/hooks/

更好的是,使用与克隆新存储库时相同的过程来应用挂钩。可以是项目范围的程序,也可以是您自己的个人程序。如果挂钩对您或您的项目很重要,则应该有一个应用、更新和恢复它们的过程。

这也是我不喜欢将客户端挂钩作为工作流程一部分的原因。它们非常适合个人剪裁,但要确保每个人都有钩子是令人担忧的。

您不能使用 git reflog 或其他方式“丢失”提交等。

(你也会丢失存储。)

您也许可以复制.git/logs/,但我不能 100% 确定。

【讨论】:

  • git clone 给我留下了一个分离的头,主分支消失了。然而起作用的是git bundle create repo.bundle --all(source)到USB上,将包复制到我的硬盘然后git clone
  • 除了git clone 部分,您的回答非常有帮助。您将其纳入您的答案是否合适,以便我可以结束这个问题(我很好)?还是我必须自己创建一个答案?我在这里比较新,所以我不太确定如何处理。
  • @KJoke 是的。继续edit the question 与您对git bundle 的体验。可能在“如果这不起作用,请使用 git clone”之后。比如“如果 that 因为 ... 不起作用,请使用 git bundle ...
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 2013-11-06
  • 1970-01-01
  • 2015-12-12
  • 2011-09-03
  • 2020-08-18
  • 1970-01-01
  • 2011-05-06
相关资源
最近更新 更多