我有一个名为img
的目录。我希望该目录在存储库上退出,但始终应为空。我的意思是只应该跟踪该目录的内容。
这是我的项目的简化版本:
myproject/
.git/
application/
public/
img/
img1.jpg
img2.jpg
vendor/
composer.json
composer.lock
我想在存储库中使它像这样:
myproject/
.git/
application/
public/
img/
vendor/
composer.json
composer.lock
我该怎么做?
根据一些研究,我必须使用.gitignore
文件。但是如何?我应该在项目的根目录上制作一个.gitignore
文件并将其写入其中吗?
// .gitignore file
public/img/*
还是应该在.gitignore
目录中创建一个img
?如果可以,我应该在里面写些什么吗?
好,现在我遇到了一个新问题。让我们解释一下我想确切地做什么。 这是场景:
我在本地开发我的网站,并将其推送到github存储库中。然后,我进入服务器并执行git pull
。还有一个img
目录,其中包含所有用户的头像。我要做的就是将真实用户的头像保留在img
目录中。如果我将整个img
目录放在.gitignore
内,则不会创建化身(因为缺少img
目录)。如果我排除img
目录的内容,那么当我执行新的git pull时,所有当前用户的头像都将消失。知道如何处理这种情况吗?
答案 0 :(得分:3)
Git不会跟踪目录,只会跟踪文件。
为了在仓库中添加一个空目录,您必须在其中放置一个文件,并在项目的.gitignore
中编写正确的规则。
但是,由于Git存储库允许在每个目录中放置一个.gitignore
文件,因此您可以在要排除的目录中放置一个文件,并将以下行放入其中:
# Ignore everything in this directory
*
# ... but do not ignore this file
!.gitignore
将新文件添加到存储库并提交。
仅此而已。
如果要将所有忽略规则放在一个位置(在项目根目录的.gitignore
文件中),则可以将一个空文件放在该目录中以忽略并放在上面前缀为.gitignore
文件的路径。
通常,这样一个空文件名为.gitkeep
(名称无关紧要,该文件用于表示其目的)。在这种情况下,请添加到项目的.gitignore
文件中:
/public/img/*
!/public/img/.gitkeep
如果您已经将public/img
中的文件添加到了存储库(并提交了文件),则必须先将其删除,以使其不再被跟踪。运行
git rm --cached public/img/*
,并将此更改与.gitignore
中的更改一起提交。 --cached
参数告诉git rm
不要从工作树中删除文件,而只是停止跟踪它们。
答案 1 :(得分:2)
您应该通过发出.gitignore
在工作目录中看到一个ls -la
文件。如果未在其中创建.gitignore
文件(与.git
文件处于同一级别)。
在该文件中,您可以将路径添加到img
文件夹中,如下所示:public/img/*
答案 2 :(得分:0)
Git不跟踪目录,仅跟踪文件。您可以执行的操作是跟踪该目录中的任何文件,例如.gitignore
,甚至跟踪名为.placeholder
的文件。您还需要取消版本化,但不删除实际文件,您可以使用git rm --cached file
# Untrack, but keep the existing files in img
git rm --cached myProject/public/img/*
# Create the placeholder file to keep the directory tracked
# You do not need this if any other versioned file exists
# in this directory or potentially any subfolders of this
# directory.
echo 'placeholder' > myProject/public/img/.placeholder
# Track the placeholder file in the img directory
git add myProject/public/img/.placeholder
# Commit your work
git commit -m 'YOUR COMMIT MESSAGE'