24

究竟是git init为了什么?我必须每台计算机执行一次还是每个使用 git 的项目执行一次?我下载了我的项目git clone并让它工作,但现在它也将我的项目存储到C:/Users/myUser/git,是某个文件夹还是我可以更改它?

我对那个文件夹不太了解,它似乎就像一个本地 git repo 之类的东西,但是是什么“管理”它,或者它为什么使用那个路径,你能解释一下吗?

这是我的理解,如果我不正确,请纠正我,需要弄清楚事实:

  1. git init适用于每个项目
  2. “用户”下的 git 文件夹是本地存储库,每次我这样做git commit时,该文件夹都会更新。
  3. 当我这样做时git push,它会从该本地存储库中获取,并放入远程存储库。
  4. 当我想更新到“HEAD”时,我只是这样做git pull
4

5 回答 5

39

这实际上是很多问题和误解。我不确定我是否能够解决所有问题,所以我只会解决直接询问的问题。

  1. git init 适用于每个项目

    几乎正确。git init用于在不在 git 下的项目上开始使用 git。对于已经在 git 下的项目,您可以使用git clone.

  2. “用户”下的 git 文件夹是本地仓库

    几乎正确。该文件夹实际上.git不是git. 这来自unix约定,所有以点开头的文件和文件夹都被认为是隐藏的。

    其次,该文件夹不在您的用户文件夹下。它位于您的项目文件夹下。所以该文件夹C:/Users/myUser/是一个项目。如果这不是您的意图,那么您很可能不小心git init在您的用户文件夹中执行了。

    每个项目.git在项目的根目录中都有一个文件夹,即项目的存储库。这是 git 与 svn 或 cvs 相比如此之快的原因之一——整个存储库都在本地硬盘上处理,没有任何网络流量。

  3. 当我执行 git push 时,它会从本地存储库中获取,然后放到远程

    正确,但仅适用于具有遥控器的存储库(通常是您创建的存储库,git clone用于复制远程存储库)。

    请注意,远程仓库不需要在另一台机器上。您可以将本地文件夹中的项目 git 克隆到另一个文件夹中,然后您可以将新文件夹中的更改推送回原始文件夹。

    git clone命令会自动为您的存储库设置必要的配置以连接回远程。但是您也可以手动配置一个 repo 设置git init来连接到远程。

  4. 什么“管理”它

    .git文件夹管理您项目的存储库。Git 不作为服务器运行*。相反,该.git文件夹充当所有 git 命令与之通信的本地“服务器”。基本上,运行 git 命令会编辑.git文件夹的内容。

    *注意:远程存储库确实运行服务器,因此您可以连接到它们。但从技术上讲,它们并不是真正的git服务器。它们是 git 可以从中下载和上传的文件服务器。

于 2012-11-23T09:16:35.217 回答
3

你的三四理解或多或少是正确的,虽然你遗漏了一些细节。

git init初始化(即创建)一个存储库。每个项目都应该在自己的存储库中。

如果您使用下载了项目,git clone则无需git init再次运行。

您应该能够将项目复制到另一个目录而不会产生任何不利影响。该路径可能是默认选择的。一定要移动整个目录。git 需要运行的元数据存储在项目目录中的隐藏文件中。

推拉可能会变得复杂,尤其是当您与他人一起进行项目时,以及当您使用分支时。在这里写一个完整的主题介绍对我来说是不明智的,所以我建议你去阅读Pro Git以获得更彻底的解释。

于 2012-11-23T08:56:26.467 回答
2

git init仅适用于您从头开始创建自己的新存储库时。它将一个目录变成一个空的 git 存储库。

当您使用git clone将现有存储库克隆到新存储库时,git init既没有必要也不需要。

于 2012-11-23T08:56:56.383 回答
0

@Jaanus 只是对@slebetman 解释的内容的一项补充git pull。它不是完全同步,而是获取不在您本地的提交。这更像是一个极端情况,请考虑以下事项 -

  1. 假设正在处理一个分支 test_branch。A、B 和 C 提交存在于origin/test_branch(您的 git 服务器上的分支),其中 C 是最近的提交。您已经拉动,现在您的本地分支机构也有 A、B 和 C。

  2. 假设由于某种原因,您必须重置提交 B 并强制重写历史,origin/test_branch将历史保留为 A 和 C。

  3. 现在,当您git pull在本地表演时。它会说everything already up to date,但请注意您对提交 B 进行了额外的更改。因此,不要将其视为同步操作,而应将其视为更多get what I don't have操作。

希望这会有所帮助。

于 2020-05-27T08:09:35.787 回答
-1
#!bin/bash
DATE=`date +%m%d%Y.%H%M%S`
TARGET="$1.$DATE"
DIR=`pwd`


function batch_convert() {
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
batch_convert $1"/"$file
else
dos2unix $1"/"$file
#echo $1"/"$file
fi
done
}

##################

echo $TARGET
cd $DIR/DCW
git pull
cd ../
batch_convert DCW
cp -R DCW tmp/$TARGET
cd tmp/$TARGET
find . -type d -name "*git*"| xargs -n20 rm -rf



for db in `cat $DIR/tmp/$TARGET/Dblist` ; do
        echo "********** DB IS $db *******"
       for dbfolder in `find * -maxdepth 0 -type d` ;do
    echo `ls -a`
        echo "***** DBFolder is  $dbfolder *****"
    if [ ! $dbfolder = $db ];then
    cp -R $dbfolder $db
    find $db -name "*.ctl"| xargs -I '{}' mv '{}' $db/${db}.ctl
    fi
    done
done
cd ../
tar -cf $TARGET.tar $TARGET
于 2017-03-08T14:42:21.573 回答