我想知道如何让git忽略实际文件夹,但跟踪并将文件夹本身中的文件推送到github?
我有一个github存储库,我想将其用作测试站点,但是当我推送代码时,它总是位于www文件夹中,这与我使用Github Pages搞砸了。我正在使用Vapid CMS,它将所有已编译的html文件放在www子文件夹中。我如何才能在该文件夹中推送内容,并使用gitignore忽略父文件夹本身?我正在使用GitKraken跟踪和推送文件。
这是我的存储库-https://github.com/jcbbuller/bigsheep.design/tree/master
谢谢!
答案 0 :(得分:1)
我建议不使用.gitignore
,而是使用以下方法在www
子文件夹中创建一个新的回购协议:
cd www
git init
git remote add origin git@github.com:jcbbuller/bigsheep.design.git
git add .
git commit -m 'initial commit'
git push -u -f origin HEAD
答案 1 :(得分:0)
Git不推送文件。 Git推动 commits 。
现在,确实会提交包含个文件,因此,您可以根据需要将其视为“推送文件”。问题是,当您确实这样想时,您最终会陷入困境,不知道该怎么做。 :-)因此,最好将Git视为推动 commits 。您的问题现在变成:
运行
git push
时,我会继续推送名为www/file1
,www/file2
等文件的提交。我想推送包含名为file1
,file2
等文件的提交。
现在答案很明显: make 提交包含名为file1
,file2
等文件的提交。为此,请进行一些现有的提交,将其保存在www
文件夹中,并告诉Git重命名所有文件,以使它们不再使用www
名称:
$ cd www
$ git mv * ..
例如。
一个明显的缺点是,现在您散布了所有文件都命名为www/file1
,www/file2
等的提交,而其他所有根本没有www
的提交,具有名为file1
,file2
等的所有文件。有两种明显的方法可以解决此问题:
还有更多的方法-如果愿意,您可以发明自己的方法-但它们全都归结为以下事实:如果某些软件坚持查看名为A
B
{{1 }}等,并且您现有的提交具有名为C
folderX/A
folderX/B
的文件,您需要进行新的不同提交,这些提交的文件具有软件所需的名称。哪个提交(如果有)是“更好”或“更熟练” ...好吧,这部分取决于您。就Git而言,它们只是不同的提交。如果您使用的所有软件都不介意将所有这些不同的提交放入单个存储库中,则可以使用单个存储库来保存它们。如果需要某些软件 ,则需要多个存储库来保存它们或修复该软件。
答案 2 :(得分:0)
提交是引用回购中的树的小对象,因此您只需提交直接引用主要历史记录中www
处的树即可。
有很多方法可以做到这一点,也许最简单的就是每次都刷新整个事情。
git branch -f pages master
git filter-branch --subdirectory-filter www pages -- www
它每次都会重新生成已经存在的(先前生成的)提交,实际上并没有添加任何多余的内容,并且它是如此简单,以至于它可能表现得很好并且很容易保持了一段时间,直到您重新了解成千上万的提交历史。只需几毫秒即可运行的完全增量版本,易于构建和理解,例如
#!/bin/sh
# post-commit and post-merge hook
[[ `git rev-parse -q --verify pages` != `git rev-parse -q --verify master:www ]] && {
pages=`git rev-parse pages`
git update-ref refs/heads/pages $(
git commit-tree ${pages:+-p pages} -m "built pages" master:www
)
}
但这只是产生相同效果的更有效方法。