我有一个项目的工作副本,没有任何源控制元数据。现在,我想在这个文件夹中执行相当于git-clone的操作,并保留我的本地更改。
git-clone不允许我克隆到现有文件夹中。这里的最佳做法是什么?
答案 0 :(得分:441)
这可以通过克隆到新目录,然后将.git
目录移动到现有目录中来完成。
如果现有目录名为“code”。
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
这也可以在克隆命令期间不进行结账时完成;可以找到更多信息here。
答案 1 :(得分:224)
请勿克隆,取而代之。在回购中:
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...
你就像克隆了一样。
这里有趣的问题(以及没有回答的问题):如何找出裸树所基于的提交,从而确定要重置的位置。
答案 2 :(得分:45)
以下我做了,检查现有目录中的主分支:
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
答案 3 :(得分:37)
我git clone
到一个新目录并将现有目录的内容复制到新克隆。
答案 4 :(得分:28)
使用临时目录很好,但如果您想避免该步骤,这将有效。从工作目录的根目录:
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
答案 5 :(得分:9)
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
答案 6 :(得分:3)
要将git repo克隆到空的现有目录中,请执行以下操作:
[TestCategory("Integration"), TestMethod()]
注意cd myfolder
git clone https://myrepo.com/git.git .
命令末尾的.
。这将把repo下载到当前的工作目录。
答案 7 :(得分:2)
这有两种方法。在可能的情况下,我会从一个干净的文件夹开始,为你的新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开始。
答案 8 :(得分:1)
很多答案已经按照OP要求的方式做了。但值得注意的是,以相反的方式做到这一点要简单得多:
git clone repo-url tmp/
cp -R working/ tmp/
您现在拥有所需的目标状态 - 新克隆+本地更改。
答案 9 :(得分:1)
这是我遇到的所有最佳方法
仅将存储库的.git文件夹(不包括文件existing-dir
中的文件)克隆到一个空的临时目录中
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
//可能想要--no-hardlinks来克隆本地仓库将.git文件夹移至包含文件的目录。
这使existing-dir
成为git仓库。
mv existing-dir/existing-dir.tmp/.git existing-dir/
删除临时目录
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git认为所有文件都已删除,这会将存储库的状态恢复为HEAD。
警告:对文件的任何本地更改都将丢失。
git reset --mixed HEAD
答案 10 :(得分:0)
通常我会首先克隆初始存储库,然后将现有文件夹中的所有内容移动到初始存储库。它每次都有效。
此方法的优点是您不会遗漏任何初始存储库,包括README或.gitignore。
您还可以使用以下命令完成以下步骤:
$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo
答案 11 :(得分:0)
如果您至少使用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
反击bare=true
选项的隐式--mirror
,从而允许存储库具有关联的工作目录,并且像普通克隆一样行事如果您想要转换为工作副本的目录中已存在.git
元数据目录,这显然不会起作用。
答案 12 :(得分:0)
您可以通过递归键入以下命令行来做到这一点:
mkdir temp_dir // Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory
答案 13 :(得分:0)
只需使用即可。在git clone
命令的末尾(位于该目录中),如下所示:
cd your_dir_to_clone_in/
git clone git@github.com/somerepo/ .
答案 14 :(得分:0)
如果要克隆相同的存储库,请在现有存储库中运行以下代码段
git pull origin master
答案 15 :(得分:0)
# If this is running in a cloud function, then GCP_PROJECT should be defined
if 'GCP_PROJECT' in os.environ:
project_id = os.environ['GCP_PROJECT']
# else if this is running locally then GOOGLE_APPLICATION_CREDENTIALS should be defined
elif 'GOOGLE_APPLICATION_CREDENTIALS' in os.environ:
with open(os.environ['GOOGLE_APPLICATION_CREDENTIALS'], 'r') as fp:
credentials = json.load(fp)
project_id = credentials['project_id']
else:
raise Exception('Failed to determine project_id')
答案 16 :(得分:0)
参考,来自 Gitlab 命令行指令:
推送现有文件夹
cd existing_folder
git init
git remote add origin <url>
git add .
git commit -m "Initial commit"
git push -u origin master
或者推送一个现有的 Git 仓库
cd existing_repo
git remote rename origin old-origin
git remote add origin <url>
git push -u origin --all
git push -u origin --tags
答案 17 :(得分:0)
将正式克隆的强制删除,然后重新克隆。
rm -rf the_ropo_name
git clone https://git.../the_ropo_name.git