以下是我的具体情况:
Branches:
branch-a
branch-b
branch-c
Working directory:
file-a
file-b
...
我不希望file-a
签到存储库,但我确实希望为每个分支保存一个不同的file-a
。让我们说这个文件-a包含每个分支的独特内容,如分支名称。
有办法做到这一点吗?
我认为我想将file-a
放入.gitignore
,以便它不会被添加到回购邮箱中。但是,问题在于我无法在执行此操作后对文件编制索引。
我认为我需要的是.gitignore
,但是从暂存区域转移到提交。
答案 0 :(得分:4)
一种可能性是使用git hooks来帮助你。它不是很简单,但是你的请求再也不符合标准的git范例。
假设您希望file-a.txt
的行为如上所述。然后使用以下名称创建文件(例如):
file-a.txt.br_master
,file-a.txt.br_dev
,...
等
在每一个中,你把你喜欢的文件放在那个分支上。然后打开/创建文件.git/info/exclude
(就像没有部署的本地.gitignore),并添加以下行:
file-a.txt*
这将阻止所有上述文件在工作区中显示为可提交文件。
将它绑定在一起的魔法将是一个运行post-checkout
的git钩子(参见例如https://www.atlassian.com/git/tutorials/git-hooks/local-hooks的教程)。该脚本将检查它是否为分支签出,然后将文件file-a.txt.br_{branch_name}
复制到file-a.txt
。脚本的确切形式取决于您,但如果您愿意,可以使用bash或python等。
答案 1 :(得分:2)
不,你做不到。
你可以使用(自Git 2.5版以来的新版本)git worktree
多工作树功能将每个分支保存在自己的私有工作树中,然后只需拥有这些文件未跟踪或忽略,并且永远不会更改任何工作树中的分支。
请注意,即使是Git版本2.9,git worktree
仍然存在一些错误。 2.6中更明显的是固定的,但是这里的工作仍在进行中。如果你达到2.6或更高,你应该没事,并避免任何特别棘手或不寻常的事情。
答案 2 :(得分:1)
将这些文件添加到您的仓库并提交。 git add file-a
并提交。当您将分支合并或推送到遥控器时,可以:
1:如果您不关心拥有空提交的repo,请使用filter-branch
删除该文件:
git filter-branch --tree-filter 'rm -f file-a' HEAD
2:如果你关心空提交。您的提交只是您想要删除的文件。您可以通过以下方式找到所有更改该文件的提交:
git log --follow -p -- file-a
然后选择删除更改文件的提交。 (互动式反思)
答案 3 :(得分:0)
如果你不想提交它,你为什么要上台呢?
你可以制作一个var express = require('express')
, router = express.Router()
// Router functions here, as normal; each of these
// run only on requests to the server
router.get('/', function (req, res, next) {
res.status(200).end('Howdy');
});
module.exports = function(my_var){
// do as you wish
// this runs in background, not on each
// request
return router;
}
钩子。
pre-commit
你可以#!/bin/bash
git reset <path_of_file-a>
它到索引但它不会被这个钩子提交。如果您确实要提交,请在git add
时添加选项-n
以绕过此挂钩。如果您希望在git commit
之前保留对file-a所做的更改,则可以在其前面添加git reset
。