我在数据库中有很多文章(标题,文字),我正在寻找一种算法来找到X最相似的文章,比如Stack Overflow的"相关问题",当你提出问题时.
我尝试谷歌搜索,但只找到关于其他"类似文本"问题的页面,比如将每篇文章与所有其他文章进行比较并在某处存储相似性.因此,我只是在我刚输入的文本上"实时"执行此操作.
怎么样?
我有一个git存储库,其结构如下所示:
+--repo.git
|
+----+bootstrap.py
+----+buildout.cfg
+----+.gitignore
+----+webapp
|
+---------+manage.py
+---------+modules
+---------+templates
+---------+static
+---------+...
+---------+...
Run Code Online (Sandbox Code Playgroud)
我想将webapp文件夹的内容向上移动一级.我的结果回购应该是这样的:
+--repo.git
|
+----+bootstrap.py
+----+buildout.cfg
+----+.gitignore
+----+manage.py
+----+modules
+----+templates
+----+static
+----+...
+----+...
Run Code Online (Sandbox Code Playgroud)
我可以通过简单地将webapp目录的所有文件移动一级,删除空webapp目录然后提交更改来完成此操作吗?这会保留webapp目录下文件的提交历史吗?
虽然对很多人来说这是一个非常简单的问题,但我想确定一下.我想要的最后一件事就是喝汤.
我尝试移动文件,但我丢失了提交历史记录,因为git没有真正处理移动或重命名.我知道即使它在日志中显示为新文件,仍然可以使用一些选项查看文件的提交历史记录git log.
根据我的阅读,实现这一目标的最佳方法是使用git-filter.我对shell或git不是很好,所以有人可以告诉我我需要执行上述操作.
一个分支(refactoringBranch)有一个完整的目录重组.文件被混乱地移动,但内容被保留.
我试图合并:
git merge --no-ff -Xrename-threshold=15 -Xpatience -Xignore-space-change refactoringBranch
git status显示大约一半的文件重命名识别.但是项目中的10000个文件中有一半未被识别为移动.
一个例子是:
# On branch master
# Changes to be committed:
# deleted: 404.php
# new file: public_html/404.php
...
# deleted: AnotherFile.php
# new file: public_html/AnotherFile.php
...
# renamed: contracts/css/view.css -> public_html/contracts/css/view.css
Run Code Online (Sandbox Code Playgroud)
建议?
重构是在git之外进行的.我做了以下事情:
refactoringBranch原产地master. refactoringBranch,这意味着我在其他目录中进行了更改,只是将它们复制粘贴到我的git存储库中. 这是我的工作流程:
git checkout -b refactoringBranch
cp -R other/place/* ./
git add . -A
git commit -a -m "blabla"
git checkout master
git merge --no-ff …Run Code Online (Sandbox Code Playgroud) Git使用什么算法来确定某些文件是否被重命名?
这就是git status几分钟之前产生的:

标有黄色框的信息不正确.实际上没有这种重命名.文件views/file/create.php并views/file/index.php在一组全新的两个文件后半小时被真正删除 - views/logo/create.php并且views/logo/index.php已创建.
这两个文件集看起来(对于Git)非常相似,但事实仍然是 - 这些不同,重命名的文件.这是一组完整的新文件,在删除第一组文件之前约半小时在不同目录中创建.
由于Git提供的信息不正确,我想满足我的好奇心,这就是我要问的原因.
在处理二进制文件时,git似乎考虑用另一个文件替换文件,修改文件重命名.例如,当用foo-1.0.3.jar或以下测试用例替换foo-1.0.1.jar时会发生这种情况:
$ dd if=/dev/urandom of=test.dat bs=1024 count=10
$ md5sum test.dat
8073aef704e9df13b44818371ebbcc0b test.dat
$ git add test.dat && git commit -m 'add binary file'
$ mv test.dat test2.dat
$ git rm test.dat
$ dd if=/dev/urandom of=test2.dat bs=1 count=1 conv=notrunc
$ md5sum test2.dat
21e1ac3ab9ba50c9dad9171f9de7232d test2.dat
$ git add test2.dat
Run Code Online (Sandbox Code Playgroud)
现在我清楚地有一个包含新内容(至少部分)和新名称的文件.但是,git认为这是一个重命名git status:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: test.dat -> test2.dat
Run Code Online (Sandbox Code Playgroud)
由于我通常使用的工具,在准备提交之前,我经常重命名文件并对其进行更改。
此时,git不再将文件检测为简单的重命名,因为文件内容不同。
我可以使用一个命令来指定某个文件,即使内容看起来有所不同,实际上它也是另一个文件的重命名吗?
考虑一下我们将以下命令应用于hello.txtgit 下跟踪的文件(在干净的工作副本中):
echo "hi" >> hello.txt
mv hello.txt bye.txt
git rm hello.txt
git add bye.txt
git status
Run Code Online (Sandbox Code Playgroud)
结果:
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: hello.txt -> bye.txt
Run Code Online (Sandbox Code Playgroud)
因此,git 知道它是同一个文件,即使它被重命名了。我有一些模糊的记忆,git 检查 inode 以确定新文件与旧的已删除文件相同。 不过,这个和这个SO 答案表明 git 只检查文件的内容,并且不会以任何方式检查它是否是相同的 inode。(我的结论(*):如果我对文件进行更大的修改,git 将不会检测到重命名,即使 inode 仍然相同。)
因此,在我看来,很明显,我错了,git 不检查 inode(或任何其他文件系统信息),只检查内容。但后来,我发现了另一个答案,它声称
除了时间戳之外,它[即git]还记录lstat的大小、inode和其他信息,以减少误报的机会。当您执行 git-status 时,它只需对工作树中的每个文件调用 lstat 并比较元数据,以便快速确定哪些文件未更改。
我对此实际上有两个问题:
Git 确实依赖(也)依赖 inode 来检测文件是否已更改,但它不使用 inode 来检测文件重命名。
我刚刚做了git rm file1.c以后的git status节目
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: file1.c
Untracked files:
(use "git add <file>..." to include in what will be committed)
dir/file2.c
dir/file3.c
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利.但是,如果git add dir/file2.c我得到了
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local …Run Code Online (Sandbox Code Playgroud) 我试图为文件的历史记录选择一个id - 我希望它是或者引用其详细信息的"对象" git log --follow <filename>.我在想:
git如何知道一个文件是后续提交中另一个文件的变体?当然,名称相同是一个强烈的提示,但它也跟踪提交时的重命名.它是否将计算结果保存在git log引用的位置(where?),或git log是否每次都重复这些计算?(这些计算是什么?)
理想情况下,我想使用nodegit访问或重新创建历史记录(提交/ blob shas列表).
git ×8
algorithm ×1
binaryfiles ×1
directory ×1
file-rename ×1
similarity ×1
string ×1
text ×1