我有一个项目的工作副本,没有任何源控制元数据。现在,我想把git-clone复制到这个文件夹中,并保留我的本地更改。

Git-clone不允许我克隆到现有的文件夹。这里的最佳实践是什么?


当前回答

下面我做了,在一个现有目录下签出主分支:

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

其他回答

有两种方法。在可能的情况下,我会为你的新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开始。

git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed

不要克隆,而是获取。在回购中:

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

你就像克隆的一样。

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

已经有很多答案可以按照OP要求的方式来做了。但值得注意的是,用相反的方式来做要简单得多:

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

现在,您拥有了所需的目标状态—刷新克隆+本地更改。

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

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

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

这也可以在不执行克隆命令的情况下完成;更多信息可以在这里找到。