我有一个项目的工作副本,没有任何源控制元数据。 现在,我想在这个文件夹中执行相当于git-clone的操作,并保留我的本地更改。
git-clone不允许我克隆到现有文件夹中。 这里的最佳做法是什么?
#1楼
这可以通过克隆到新目录,然后将.git目录移动到现有目录中来完成。
如果您的现有目录名为“code”。
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
这也可以在克隆命令期间不进行结账时完成; 更多信息可以在这里找到。
#2楼
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
#3楼
这有两种方法。 在可能的情况下,我会从一个干净的文件夹开始,为你的新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开始。
#4楼
不要克隆,取而代之。 在回购:
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...
而你就像克隆了一样。
这里有趣的问题(以及没有回答的问题):如何找出裸树所基于的提交,从而确定要重置的位置。
#5楼
使用临时目录很好,但如果你想避免这一步,这将有效。 从工作目录的根目录:
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master