在我听说版本控制的奇妙之前,我将项目保存在“项目 x 1.0”、“项目 x 1.1”、“项目 x 1.2”等文件夹中。这种方法存在大量冗余,所以我想使用 git 来整合和版本控制系统。
最好的方法是什么?我假设我应该首先在“project x 1.0”上运行 git init,但是然后我如何将其他文件夹合并到项目中作为新的提交?(我对 git 还很陌生)
答案1
我将首先创建一个新的空目录,在其中创建一个 repo ,然后仅使用一个文件或某些东西git init
进行第一次提交。.gitignore
然后将第一个修订版本中的所有文件复制到这个新目录,git add
然后git commit
。这将为您提供第一个真正的提交。
然后用第二次修订的内容复制/覆盖所有文件。git add
,git commit
。
您可以根据需要重复此操作。第一步其实不是必需的,您可以在第一个修订版的目录中执行此操作。但在新目录中执行此操作可以让您完全不更改备份中的任何内容,因此如果您想改进/调整流程,您可以重新从头开始,而不会冒丢失旧目录中任何内容的风险。
答案2
有一本关于 git 的好书,叫做《Pro Git》。部分关于如何从自定义结构迁移。(请参阅自定义导入器)。这有点困难,但如果您有很多历史记录,那么这将是最好的方法。
另一种方法是:
# initialize a new repository
git init .
touch .gitignore
git add .
git commit -m "initial commit"
# copy all the files to working directory
cp -R backup_v01/* .
# stage all the files
git add .
# make the first commit
git commit -m "v0.1 from backup"
# remove all files
git rm -r *
# copy all the files to working directory
cp -R backup_v02/* .
git add .
git commit -m "v0.2 from backup"
这可以优化,但这个脚本很容易理解。在更新内容之前,您需要从存储库中删除所有旧文件,否则您将会保留一些旧的已删除文件。
当然整个过程可以做成一个脚本(repo.sh):
#!/bin/bash
REPODIR=$1
# initialize a new repository
git init $REPODIR
cd $REPODIR
touch .gitignore
git add .
git commit -m "initial commit"
while read DIR
do
# remove all files
git rm -r *
# copy all the files to working directory
cd ..
cp -R $DIR/* $REPODIR/.
# go back to repo dir
cd $REPODIR
# stage all the files
git add .
# make the first commit
git commit -m "$DIR from backup"
done
为了使其使用相对路径工作,必须进行文件夹切换。
您可以通过将所有文件夹路径发送到脚本并指定存储库目录(它不能存在)来使用它:
# let's say all the backups are in this folder
# and there are no other folders
# test whether everything is in correct order
ls -d */ | sort
# verify that there is no repository directory
rm -rf REPO_DIR
# pipe the folder listing to the script
ls -d */ | sort | repo.sh REPO_DIR
答案3
另一种方法是,init
在你的第一个项目版本中注册并提交后,移动将.git
存储库目录从 1.0 副本移至 1.1 副本,添加这些更改(用于git add --all
注意删除)并提交,然后将其移动到 1.2,依此类推。
这种方法之所以有效,是因为 Git 不会在目录之外保存任何有关存储库状态的信息.git
,因此它并不关心您是移动.git
文件还是替换文件。但是,如果您有想要忽略的文件.gitignore
,则需要将忽略文件单独添加到每个项目版本。