克隆一个 Git 仓库的 .git 目录

20

我有一个与Google Drive同步的存储库,但我已经将.git目录忽略了,因此现在上传到了Google Drive。

最近我格式化了我的Gentoo机器,在重新同步所有Google Drive文件后,我意识到.git目录不见了。

问题是我不记得是否有一些未提交或未推送到github的本地更改。

我一直在搜索,但我只找到了相反问题的答案(没有.git目录克隆)

在确定没有可能丢失本地更改之前,我不想克隆我的存储库。

是否有方法仅克隆.git文件夹,然后推送我可能在机器上进行的任何本地更改?

6个回答

31

简单的解决方案是:

git clone --no-checkout <repo_url>

或者,如果您已经为此创建了一个空目录,则:

cd myrepo
git clone --no-checkout <repo_url> .

2
或者 git clone --no-checkout <repo_url> myrepo =) - Xupypr MV
2
如果您的目录不为空怎么办? - Allan Bowe
1
如果您的目录不为空,git 将不会进行克隆。但是,如果您想要目录中的内容,只需克隆到一个空目录中,然后将您拥有的文件复制到您克隆的目录中即可。 - rfay
1
它不会恢复索引,所以如果你只是将.git目录移动到工作树中,git status输出将不正确。 - EvgenKo423

7

我已经解决了这个问题。这是一个简单的过程:

  1. 我将代码库克隆到不同的位置,例如(在/tmp中)。
  2. 我将.git文件夹复制到我的原始代码库文件夹中。
  3. 我在我的原始代码库文件夹中执行了git status命令,所有本地更改都在那里。

希望对其他人有所帮助。


1
这种方法的唯一问题是您还没有机会检出特定分支,而默认克隆将检出“master”分支,这不是您想要将本地文件集与之进行比较的内容。 - g19fanatic
由于您只需要 .git 文件夹而不是整个工作目录,请确保使用 --bare 选项克隆它。 - Eissa N.
1
@EissaN。使用--bare选项时,不会创建远程跟踪分支,因此您无法推送和比较它们。 - EvgenKo423

3
如另一个答案所述,git clone命令有一个--no-checkout选项,但这并不是问题的直接或完整解决方案:
  1. 它拒绝将克隆到非空目录;
  2. 它不会还原索引(因为目录中不应该有任何文件)。
因此,如果您只是将.git目录移动到您的工作树中并运行git status,则会得到错误的结果:
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
        deleted:    Home.rest

Untracked files:
        Home.rest

话虽如此,解决这个问题有两种方法:
  • Clone using temporary directory:
    $ git clone -n <repo_url> tmp
    $ mv tmp/.git/ . && rm -d tmp
    $ git read-tree HEAD
    
  • Imitate clone in existing directory with a working tree:
    $ git init
    $ git remote add -m master -f origin <repo_url>
    $ git reset refs/remotes/origin/HEAD
    $ git branch -u origin
    
如果有更多人使用同一个代码库(也就是说,可能有一些远程的变更),你会很难弄清楚你本地仓库的状态。另一方面,如果你确定没有本地变更,那么删除你的工作目录并重新克隆整个代码库会更容易。
$ rm -rf <local_repo_dir>
$ git clone <repo_url> <local_repo_dir>

2
  1. 在您的计算机上使用git clone命令将在线存储库克隆到不同的文件夹中。
  2. 切换到您感兴趣的分支,以便比较本地文件与之相比。
  3. 然后将文件夹内容复制/粘贴到新克隆的文件夹中。
  4. 检查更改(如果有)并像往常一样提交。

其实我现在已经解决了xD。我将repo克隆到另一个目录并复制了.git目录。现在一切都正常了! - Alejandro Alcalde
我应该删除我的问题还是发布一个回答到我的问题? - Alejandro Alcalde
4
由于有一个被赞同的答案,你无法删除这个问题。你可以选择发布自己的回答,但在标记为已接受答案之前可能会有一些延迟(我认为是几天)。另一方面,你所说的做法与这个答案非常接近;你应该考虑接受这个答案。 - Jonathan Leffler
是的,两天。谢谢! - Alejandro Alcalde

1

基本上你想要的是一个新鲜的.git目录,没有对文件进行任何更改,这样你就可以运行git status并查看是否有任何更改。

假设你的pwd是具有旧的.git目录的项目目录,该目录已设置存储库的origin,则可以运行以下命令:

mkdir -p /var/www/tmp/_delme \
    && git clone --no-checkout `cat .git/config | grep url | awk -F' = ' '{print $2}'` /var/www/tmp/_delme \
    && rm -rf .git \
    && mv /var/www/tmp/_delme/.git . \
    && git add -A
    && rm -rf /var/www/tmp/_delme

1
如果我有一个名为local_directory的目录,在GitHub上创建了一个名为remote_local_directory的新仓库。我想将local_directory推送到remote_directory
我使用以下命令:
git clone --bare ${remote_directory}.git local_directory/.git
cd local_directory
git init
git add .
git commit
git push --set-upstream origin master

git clone --bare 只克隆 .git 目录,而 git init 会重新初始化本地仓库。

使用其他 git 命令时,本地仓库与远程仓库相关联。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接