是否可以在非空目录中初始化新的git存储库,并跟踪初始化后新添加的仅 个文件/文件夹,而忽略旧文件/文件夹。例如:
初始化新存储库之前的当前文件夹结构:
FolderA/
FolderB/
file1.php
file2.php
初始化新存储库并创建新文件和目录后,
FolderA/ // old, ignore
FolderB/ // old, ignore
FolderC/ // new, track
file1.php // old, ignore
file2.php // old, ignore
file3.php // new, track
答案 0 :(得分:3)
Git只会使用git add
跟踪您明确告诉您的文件。因此,您无需执行任何操作:只是不要告诉Git跟踪您不希望其跟踪的文件。
如果您查看git status
,这会很烦人,它将列出所有未跟踪的文件。
对此也有一个简单的解决方案:只需忽略所有文件:
echo '*' > .gitignore
这将告诉Git忽略所有文件。您仍然可以使用git add -f
将单个文件添加到存储库中(-f
是强制Git忽略文件被忽略的事实所必需的。)
如果要使用git add .
或git add somedirectory
添加所有新文件,则需要在.gitignore
中单独列出所有要忽略的文件。您可以使用我上面描述的“烦人”事实,即git status
将列出所有未跟踪的文件:
git status --porcelain -uall | grep -E '^\?\? ' | cut -d ' ' -f2- > .gitignore
--porcelain
将git status
的输出格式指定为“瓷v1”格式。瓷器输出格式保证从不更改,并且设计成易于通过机器解析,这与短或长输出格式不同,后者设计成易于读取,因此可以更改以使其成为可能更容易阅读。 -uall
告诉git status
列出所有个未跟踪的文件,否则,如果目录中的所有文件均未跟踪,则只会列出目录名称。
grep
查找以??
开头的行,这是列出未跟踪文件的方式。然后cut
切出??
之后的所有内容,即文件名。
注意:例如,这将以名为abc\n?? def.txt
的文件中断。如果您有此类文件,则需要通过以下方式强化命令:使用-z
的{{1}}标志来打印以ASCII NUL代替换行符的记录。
答案 1 :(得分:0)
如果git仅忽略少量文件,则可以使用git的gitignore
功能。
要创建简单的gitignore,请按照以下步骤操作:
.gitignore
的文件列出您要被git忽略的所有文件,并在每个单独的行上列出每个文件的名称。 例如。
文件夹A 文件夹B file1.php file2.php
有关更复杂的gitignore
,请参见:
您还可以使用诸如https://www.gitignore.io/之类的工具为您生成一个gitignore
文件。
希望这会有所帮助。
答案 2 :(得分:0)
git init
本身无法做到这一点,至少据我所知。但是一点点贝壳魔术就可以解决问题:
cd /path/to/directory/
touch .gitignore # creates file .gitignore if not yet existing
for file in *; do
echo $file >> .gitignore
done # appends all the filenames of files in directory to file .gitignore
git init # inits the repository
初始化存储库后,您仍需要在提交之前添加文件(包括.gitignore
)。
答案 3 :(得分:-1)
最后我排除了所有文件/文件夹,只包括特定的文件/文件夹。这是我所做的:
.gitignore
文件,并添加*
以取消跟踪所有文件和文件夹.gitignore
,从现在开始我最终的.gitignore现在使用以下模式:
# Ignore everything
*
# Include folders
!/folderC
!/folderD
# Include files
!file3.php
!file4.php
# Include files containing
!*foo*
此解决方法目前似乎工作正常。感谢Jörg W Mittag和Michael H.的回答,我被指出了正确的方向。
其他SO用户也提供了一些有用的资源:
Make .gitignore ignore everything except a few files
How do I tell Git to ignore everything except a subdirectory?