When we push to update an existing ref, if: * the object at the tip of the remote is not a commit; or * the object we are pushing is not a commit, it won't be correct to suggest to fetch, integrate and push again, as the old and new objects will not "merge". We should explain that the push must be forced when there is a non-committish object is involved in such a case. If we do not have the current object at the tip of the remote, we do not even know that object, when fetched, is something that can be merged. In such a case, suggesting to pull first just like non-fast-forward case may not be technically correct, but in practice, most such failures are seen when you try to push your work to a branch without knowing that somebody else already pushed to update the same branch since you forked, so "pull first" would work as a suggestion most of the time. And if the object at the tip is not a commit, "pull first" will fail, without making any permanent damage. As a side effect, it also makes the error message the user will get during the next "push" attempt easier to understand, now the user is aware that a non-commit object is involved. In these cases, the current code already rejects such a push on the client end, but we used the same error and advice messages as the ones used when rejecting a non-fast-forward push, i.e. pull from there and integrate before pushing again. Introduce new rejection reasons and reword the messages appropriately. [jc: with help by Peff on message details] Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			26 lines
		
	
	
		
			785 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			26 lines
		
	
	
		
			785 B
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef ADVICE_H
 | 
						|
#define ADVICE_H
 | 
						|
 | 
						|
#include "git-compat-util.h"
 | 
						|
 | 
						|
extern int advice_push_update_rejected;
 | 
						|
extern int advice_push_non_ff_current;
 | 
						|
extern int advice_push_non_ff_default;
 | 
						|
extern int advice_push_non_ff_matching;
 | 
						|
extern int advice_push_already_exists;
 | 
						|
extern int advice_push_fetch_first;
 | 
						|
extern int advice_push_needs_force;
 | 
						|
extern int advice_status_hints;
 | 
						|
extern int advice_commit_before_merge;
 | 
						|
extern int advice_resolve_conflict;
 | 
						|
extern int advice_implicit_identity;
 | 
						|
extern int advice_detached_head;
 | 
						|
 | 
						|
int git_default_advice_config(const char *var, const char *value);
 | 
						|
void advise(const char *advice, ...);
 | 
						|
int error_resolve_conflict(const char *me);
 | 
						|
extern void NORETURN die_resolve_conflict(const char *me);
 | 
						|
void detach_advice(const char *new_name);
 | 
						|
 | 
						|
#endif /* ADVICE_H */
 |