【问题标题】:default git behavior I don't understand我不明白的默认 git 行为
【发布时间】:2011-02-22 02:17:29
【问题描述】:

我尚未决定是否喜欢以下关于不受版本控制的文件/文件夹的行为。

特别是,当您签出不同的分支时,未版本化的文件似乎会跟随您,这似乎很奇怪。似乎所说的文件应该只存在于创建它们的分支中。

有人可以帮我理解为什么/如果这是可取的行为吗?

例如:

shopkins@shax:~/tmp/test$ ls
hello.txt
shopkins@shax:~/tmp/test$ git branch  
-
* master
my_branch
shopkins@shax:~/tmp/test$ 
shopkins@shax:~/tmp/test$ git checkout my_branch 
Switched to branch 'my_branch'
shopkins@shax:~/tmp/test$ mkdir adir
shopkins@shax:~/tmp/test$ touch adir/my_branch.txt
shopkins@shax:~/tmp/test$ git add adir/
shopkins@shax:~/tmp/test$ git commit -a -m "added adir with my_branch.txt"
[my_branch d36964c] added adir with my_branch.txt
0 files changed, 0 insertions(+), 0 deletions(-)
shopkins@shax:~/tmp/test$ git checkout my_branch
Switched to branch 'my_branch'
shopkins@shax:~/tmp/test$ tree
.
|-- adir
|   |-- my_branch.txt
|   `-- orphan.txt
`-- hello.txt

1 directory, 3 files

create mode 100644 adir/my_branch.txt
shopkins@shax:~/tmp/test$ touch adir/orphan.txt
shopkins@shax:~/tmp/test$ git checkout master
Switched to branch 'master'
shopkins@shax:~/tmp/test$ ls
adir  hello.txt
shopkins@shax:~/tmp/test$ tree
.
|-- adir
|   `-- orphan.txt
`-- hello.txt

1 directory, 2 files

编辑 事实证明,在以下第一次编辑中,分支之间的文件没有任何变化。感谢大家的帮助!

编辑 似乎 git 在签出时不会写入版本化文件的修改。在以下示例中,another.txt 不受版本控制:

shopkins@shax:~/tmp/test$ ls -l
total 4
drwxr-xr-x 2 shopkins shopkins 4096 2011-02-21 21:49 adir
-rw-r--r-- 1 shopkins shopkins    0 2011-02-21 21:47 another.txt
-rw-r--r-- 1 shopkins shopkins    0 2011-02-21 21:49 hello.txt
shopkins@shax:~/tmp/test$ git checkout my_branch
Switched to branch 'my_branch'
shopkins@shax:~/tmp/test$ ls -l
total 4
drwxr-xr-x 2 shopkins shopkins 4096 2011-02-21 21:49 adir
-rw-r--r-- 1 shopkins shopkins    0 2011-02-21 21:47 another.txt
-rw-r--r-- 1 shopkins shopkins    0 2011-02-21 21:49 hello.txt
shopkins@shax:~/tmp/test$ 

【问题讨论】:

    标签: git git-branch


    【解决方案1】:

    Git 甚至不知道存在未版本控制的文件。从技术上讲,它们甚至不是存储库的一部分。这就是为什么它们被称为“未版本控制的文件”。除非被告知,否则 Git 不会修改、删除、存储或跟踪任何文件。

    需要这样做的典型情况是,如果您的软件生成临时文件作为其构建过程的一部分,或者编译后的可执行文件与源代码位于同一目录中。显然,如果有人正在克隆您的存储库以便他们可以从您那里下载您的软件,您会希望所有这些文件都被“留下”。但更重要的是,您不希望它们弄乱版本历史。这些文件何时更改无关紧要,仅在源代码更改时才重要。因此,在每次提交时查看这些文件的差异只会让您更难找到您真正想要的信息。

    【讨论】:

    • 感谢您的意见。如果尝试在不同的分支之间重新编译,我担心这样的临时文件(如编译的可执行文件)会导致问题。假设你切换到一个分支并执行一个 make 命令,然后切换到另一个分支并执行另一个 make,编译器会因为文件/可执行文件的日期修改属性而认为一切都是最新的吗?
    • 我相信 GIT 会在您进行分支切换时写入文件修改时间(如果需要在切换时更新文件)。这意味着 make 将看到对该文件的任何依赖项都未满足并重新编译它们。我不能代表其他构建系统,但我相信它们都以类似的方式工作。
    • 我测试了我认为你的意思。你能看看编辑吗?
    • 这两个分支之间实际上没有任何变化。您正在查看 git 树上的同一节点。您需要在 some.file 中有不同的内容。
    • 如果版本化文件不需要为了在分支之间切换而改变,它们不会。如果分支实际上包含不同版本的文件,那么您的结果会有所不同。
    【解决方案2】:

    这可以使构建更快,因为未添加的输出在分支开关之间徘徊,并且您没有 make 输出到某个外部目录。

    【讨论】:

      【解决方案3】:

      为什么 git 会删除它无法恢复的文件? Git 只留下它不知道的文件。

      【讨论】:

      • 如果我将 orphan.txt 文件添加到 my_branch 并提交更改,然后结帐回 master,'adir' 不再存在。我想知道为什么它会保留目录,直到它没有未版本控制的文件?
      • Git 永远不会删除文件,除非被特别告知。如果目录包含没有被告知删除的文件,它将保留目录。
      • @Max E. 是的。那是一个反问。 @Hersheezy 我的意思是:git 不应该删除未跟踪的文件,因为它无法恢复它们。
      猜你喜欢
      • 2017-04-05
      • 2023-03-10
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2015-07-25
      • 2022-10-21
      • 1970-01-01
      相关资源
      最近更新 更多