首页 文章

“git clone”到现有文件夹的最佳做法是什么?

提问于
浏览
343

我有一个项目的工作副本,没有任何源控制元数据 . 现在,我想在这个文件夹中执行相当于git-clone的操作,并保留我的本地更改 .

git-clone不允许我克隆到现有文件夹中 . 这里的最佳做法是什么?

12 回答

  • 9

    使用临时目录很好,但如果你想避免这一步,这将有效 . 从工作目录的根目录:

    $ rm -fr .git
    $ git init
    $ git remote add origin your-git-url
    $ git fetch
    $ git reset --mixed origin/master
    
  • 0
    git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
    
  • 395

    这可以通过克隆到新目录,然后将 .git 目录移动到现有目录中来完成 .

    如果现有目录名为“code” .

    git clone https://myrepo.com/git.git temp
    mv temp/.git code/.git
    rm -rf temp
    

    这也可以在克隆命令期间不进行结账时完成;更多信息可以在here找到 .

  • 2

    不要克隆,取而代之 . 在回购:

    git init
    git remote add origin $url_of_clone_source
    git fetch origin
    git checkout -b master --track origin/master # origin/master is clone's default
    

    然后,您可以重置树以获得所需的提交:

    git reset origin/master # or whatever commit you think is proper...
    

    而你就像克隆了一样 .

    这里有趣的问题(和没有回答的问题):如何找出你的裸树所基于的提交,因此要重置到哪个位置 .

  • 37

    我将 git clone 添加到新目录并将现有目录的内容复制到新克隆 .

  • 27

    以下我做了,检查现有目录中的主分支:

    git init
    git remote add origin [my-repo]
    git fetch
    git checkout origin/master -ft
    
  • 1

    这有两种方法 . 在可能的情况下,我会从一个干净的文件夹开始,为你的新git工作目录,然后在以后复制你的版本的东西 . 这可能看起来像*:

    mv $dir $dir.orig
    git clone $url $dir
    rsync -av --delete --exclude '.git' $dir.orig/ $dir/
    rm -rf $dir.orig
    

    此时,您应该拥有一个非常干净的工作副本,并将您之前的工作文件夹作为当前工作目录,因此如果您运行 git status ,任何更改包括文件删除都将显示在雷达上 .

    另一方面,如果你真的必须反过来做,你可以得到相同的结果,如下所示:

    cd $dir
    git clone --no-checkout $url tempdir
    mv tempdir/.git .
    rmdir tempdir
    git reset --mixed HEAD
    

    无论哪种方式,我要做的第一件事就是运行像 git stash 之类的东西来获取所有本地更改的副本,然后你可以重新应用它们并处理你想要提交的那些 .

    *这两个示例都假设您从项目父目录中的shell开始 .

  • 2

    要将git repo克隆到空的现有目录,请执行以下操作:

    cd myfolder
    git clone https://myrepo.com/git.git .
    

    注意 git clone 命令末尾的 . . 这将把repo下载到当前的工作目录中 .

  • 1

    很多答案已经按照OP的要求做了 . 但值得注意的是,以相反的方式做到这一点要简单得多:

    git clone repo-url tmp/
    cp -R working/ tmp/
    

    您现在具有所需的目标状态 - 新克隆本地更改 .

  • 28

    This is the Best of all methods i came across

    将存储库的.git文件夹(不包括文件,因为它们已经在 existing-dir 中)克隆到一个空的临时目录中

    • git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp //可能需要--no-hardlinks来克隆本地仓库

    将.git文件夹移动到包含这些文件的目录 . 这使 existing-dir 成为一个git repo .

    • mv existing-dir/existing-dir.tmp/.git existing-dir/

    删除临时目录

    • rmdir existing-dir/existing-dir.tmp

    • cd existing-dir

    Git认为所有文件都被删除,这会将repo的状态恢复为HEAD .

    警告:文件的任何本地更改都将丢失 .

    • git reset --hard HEAD
  • 208

    如果您至少使用git 1.7.7(其中教授 clone --config 选项),则将当前目录转换为工作副本:

    git clone example.com/my.git ./.git --mirror --config core.bare=false
    

    这适用于:

    • 将存储库克隆到新的 .git 文件夹中

    • --mirror 使新克隆成为纯粹的元数据文件夹,因为 .git 需要

    • --config core.bare=false--mirror 选项的隐式 bare=true 进行了反击,从而允许存储库具有关联的工作目录,并且像普通克隆一样运行


    如果您希望转换为工作副本的目录中已存在 .git 元数据目录,这显然不起作用 .

  • 0

    通常我会首先克隆初始存储库,然后将现有文件夹中的所有内容移动到初始存储库 . 它每次都有效 .

    此方法的优点是您不会遗漏任何初始存储库,包括README或.gitignore .

    您还可以使用以下命令完成以下步骤:

    $ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo
    

相关问题