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

时间:2011-03-21 13:04:53

标签: git

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

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

18 个答案:

答案 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中的文件)克隆到一个空的临时目录中

  1. git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp //可能想要--no-hardlinks来克隆本地仓库

将.git文件夹移至包含文件的目录。 这使existing-dir成为git仓库。

  1. mv existing-dir/existing-dir.tmp/.git existing-dir/

删除临时目录

  1. rmdir existing-dir/existing-dir.tmp

  2. cd existing-dir

Git认为所有文件都已删除,这会将存储库的状态恢复为HEAD。

警告:对文件的任何本地更改都将丢失。

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