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

rip*_*234 418 git

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

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

ami*_*tas 497

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

如果您的现有目录名为"code".

git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,这正是@ChrisJohnsen提出的他在评论中留下的建议.我发现它很有用,并希望将它变成一个真正的答案.克里斯,如果你最终得到答案,我会很乐意删除这个. (24认同)
  • 我将此添加为第三步:mv temp/.gitignore code/.gitignore (3认同)
  • 谢谢!虽然缺少像"git checkout - "这样的步骤.因为它认为所有文件都被删除了,对吗? (2认同)
  • 不,只要您使用`git clone`作为第一个命令,就不需要进一步的checkout命令.如果您在第一步中使用了诸如`git clone --no-checkout`之类的东西,那么在移动.git目录之后,将需要使用`git reset HEAD`告诉git文件尚未被删除. (2认同)

And*_*rey 254

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

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
Run Code Online (Sandbox Code Playgroud)

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

git reset origin/master # or whatever commit you think is proper...
Run Code Online (Sandbox Code Playgroud)

而你就像克隆了一样.

这里有趣的问题(以及没有回答的问题):如何找出裸树所基于的提交,从而确定要重置的位置.

  • 我不喜欢这个 - 每个github设置"提示:凭证助手只有在克隆HTTPS存储库URL时才有效." 我正在使用凭证助手,这让我失去了一个长长的,相当无果的兔子洞. (7认同)
  • 'git checkout --track origin/master'也可以很好地代替'git checkout -b master --track origin/master'.不需要重置. (4认同)
  • 我收到错误“Git 错误:以下未跟踪的工作树文件将被 checkout 覆盖”,因此我添加了此命令:git clean -d -fx "" (2认同)
  • @AndreasKrey您的原始答案(我进入编辑历史查看)正是问题(和我)所需要的。结帐时更改的答案不使用 -f,这会丢弃本地更改,这正是我 * 不* 想要的。如果我是你,我会考虑回滚到你原来的答案。 (2认同)

ale*_*zel 57

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

git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,并避免了任何文件系统修改。 (3认同)
  • 实际上,这确实是OP(和我)*所不想要的,那就是覆盖本地更改。 (3认同)
  • 有人可以解释为什么在这里使用`-t`标志吗? (2认同)

jhw*_*ist 37

我将git clone转到一个新目录并将现有目录的内容复制到新克隆.

  • `git clone tver && git mv tmp/.git.&& rm -rf tmp`换句话说,将`.git`目录从临时克隆中移出似乎比清除克隆的工作树并在那里复制现有文件更简单. (70认同)
  • @Dennis,这是一个错字:那个命令应该是普通的`mv`,而不是`git mv`; 虽然这并不能解释你为什么已经有一个`.git`文件(包含`gitdir:some/path/to/a/git-dir`,一个"gitfile";如果它不存在,那么你会看到`fatal:不是git存储库(或任何父目录):(.git`). (6认同)
  • 如果你这样做,请确保在仔细提交之前检查差异 - 这是一个绝对的经典案例,你可以在你获得工作副本时意外恢复源代码库中所做的更改 - 因为没有足够的信息在工作副本中找出您所做的更改与开始进行更改之前的更改,以及与repo中进行的其他更改合并.我已经看到这种情况在这种情况下一次又一次地发生,到了我"强烈气馁"我自己以及与之合作过的人. (4认同)
  • @ChrisJohnsen `git mv tmp/.git .` 返回 `fatal: cannot move directory over file, source=tmp/.git, destination=.git` 对我来说。有谁知道是什么问题? (2认同)

小智 31

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

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
Run Code Online (Sandbox Code Playgroud)

  • `git reset --hard origin/master`将删除所有本地文件. (19认同)
  • 要补充上面已经指出的内容,“hard”和“mixed”之间的区别在于,mixed 将保留本地更改(因此,如果您稍后尝试拉取,它将显示例如 *Cannot pull with rebase: You have unstaged Changes) .请提交或隐藏它们*),而hard将丢弃那些本地更改 (4认同)

nwi*_*llo 11

git init
git remote add origin git@github.com:<user>/<repo>.git
git remote -v
git pull origin master
Run Code Online (Sandbox Code Playgroud)


ret*_*.at 10

git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
Run Code Online (Sandbox Code Playgroud)

  • 使用`git reset --hard`将会对本地文件的更改进行核实,特别是不是这个OP请求的内容.应该使用`--mixed`代替. (7认同)

okT*_*alk 10

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

cd myfolder
git clone https://myrepo.com/git.git . 
Run Code Online (Sandbox Code Playgroud)

请注意命令.末尾的git clone。这会将存储库下载到当前工作目录中。

  • `致命:目标路径'。' 已经存在并且不是空目录。` (9认同)
  • OP 询问如何克隆到现有项目中,并指出 git clone 抱怨。不好的答案。 (9认同)

And*_*rew 5

很多答案已经按照OP要求的方式进行了。但值得注意的是,相反的做法要简单得多:

git clone repo-url tmp/
cp -R working/ tmp/
Run Code Online (Sandbox Code Playgroud)

您现在拥有所需的目标状态 - 新鲜克隆 + 本地更改。