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

我有一个项目的工作副本,没有任何源代码pipe理元数据。 现在,我想做相当于git克隆到这个文件夹,并保持我的本地更改。

git-clone不允许我克隆到一个现有的文件夹。 这里最好的做法是什么?

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

如果您的现有目录名为“代码”。

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

这也可以在克隆命令期间不做结账的情况下完成; 更多的信息可以在这里find。

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

 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... 

你就像你克隆。

这里有一个有趣的问题(和一个没有答案的问题):如何找出你的赤裸裸的树是基于哪个提交,因此重置到哪个位置。

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

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

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

以下我做了,在现有的目录结帐主分支:

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

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

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

注意到. 在你的git clone命令的末尾。 这将下载到当前工作目录的回购。

有两种方法。 在可能的情况下,我会从新的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以获得所有本地更改的git stash副本,然后您可以重新应用它们,并通过哪些你想提交的工作。

* 这两个例子都假定你从你项目的父目录下的shell开始。

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

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

这工作:

  • 将资源.git到一个新的.git文件夹中
  • --mirror将新克隆变成纯粹的元数据文件夹,就像.git需要的那样
  • --config core.bare=false反制--mirror选项的隐含的bare=true ,从而允许存储库有一个关联的工作目录,并像一个普通的克隆

如果一个.git元数据目录已经存在于你想要转换成工作副本的目录中,这显然不起作用。

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

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

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